배포 스크립트란?
이 단원에서는 리소스가 deploymentScripts
ARM(Azure Resource Manager) 템플릿을 확장하는 방법을 알아봅니다.
ARM 템플릿은 유용한 기능입니다. 이를 사용하여 클라우드 인프라의 원하는 상태를 선언하고 API 및 서비스에서 해당 인프라를 이용하는 방법을 파악할 수 있습니다. 그러나 Azure Resource Manager에서 제공하는 것 이외의 작업을 수행해야 하는 경우도 있습니다.
배포 스크립트란?
deploymentScripts
리소스는 템플릿 배포의 일부로 Docker 컨테이너에서 실행되는 PowerShell 또는 Bash 스크립트입니다. 기본 컨테이너 이미지에는 Azure CLI 또는 Azure PowerShell을 사용할 수 있습니다. 이러한 스크립트는 ARM 템플릿을 처리하는 동안 실행되므로 배포 프로세스에 사용자 지정 동작을 추가할 수 있습니다.
배포 스크립트는 관리 ID 를 사용하여 Azure에 인증합니다. 관리되는 ID는 Azure 플랫폼이 관리하는 자격 증명 및 수명 주기의 서비스 주체입니다. 이 ID는 Azure PowerShell 또는 Azure CLI 명령이 환경에서 작동하는 데 사용하는 ID입니다. ID를 할당하기 때문에 deploymentScripts
리소스가 영향을 줄 수 있는 범위를 제어합니다.
deploymentScripts
리소스는 배포의 다른 리소스에서 사용할 수 있는 출력을 생성합니다. 그런 다음, 외부 시스템에서 정보를 조회하거나 환경의 현재 상태에 따라 데이터를 제공하여 나머지 배포에 영향을 줄 수 있습니다.
배포 스크립트 작동 방식
리소스는 deploymentScripts
사용자가 제공한 스크립트(템플릿에서 또는 URI에서)와 일부 지원 스크립트를 가져와 Azure 컨테이너 인스턴스에서 실행합니다. 해당 컨테이너 인스턴스에는 사용자가 제공하는 관리 ID가 할당됩니다. 스크립트 및 해당 출력은 Azure Storage 계정의 파일 공유에 저장됩니다.
템플릿 배포가 실행되면 대상 리소스 그룹에 기존 deploymentScripts
리소스가 있는지 확인합니다. 이러한 리소스가 있으면 속성을 비교합니다. 모든 것이 일치하면 새로운 작업이 발생하지 않습니다. 리소스가 없거나 변경된 경우 Azure Resource Manager는 새 컨테이너 인스턴스를 만들고 해당 컨테이너 인스턴스 내에서 배포 스크립트를 실행합니다. 정의된 출력은 배포의 뒷부분에서 사용하기 위해 Azure Resource Manager로 다시 전달됩니다.
배포 스크립트 구조
ARM 템플릿에 사용자 지정 동작을 추가하려면 deploymentScripts
리소스로 시작합니다. 최소한 다음과 같은 일반적인 세부 정보를 제공해야 합니다.
-
name
리소스의deploymentScripts
입니다. -
type
및apiVersion
값입니다. - 지원 리소스가 만들어지는 위치(
location
값)입니다. - 빈
properties
개체입니다. 곧 그 점에 도달할 것입니다.
두 가지 deploymentScripts
관련 값이 필요합니다.
kind
: 실행할 스크립트의 유형(AzurePowerShell
또는AzureCLI
)입니다.{ "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "myFirstDeploymentScript", "location": "[resourceGroup().location]", "kind": "AzurePowerShell", "identity": { "type": "UserAssigned", "userAssignedIdentities": { "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {} } } }
resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: 'myFirstDeploymentScript' location: resourceGroup().location kind: 'AzurePowerShell' identity: { type: 'UserAssigned' userAssignedIdentities: { '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {} } } }
identity
: 컨테이너 인스턴스에서 사용하는 관리 ID입니다. 관리 ID를 미리 만들고 다음 예제와 같이 지정할 수 있습니다. 템플릿에서 생성하고 다음 연습에서 이를 참조할 수 있습니다.{ "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "myFirstDeploymentScript", "location": "[resourceGroup().location]", "kind": "AzurePowerShell", "identity": { "type": "UserAssigned", "userAssignedIdentities": { "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {} } } }
resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: 'myFirstDeploymentScript' location: resourceGroup().location kind: 'AzurePowerShell' identity: { type: 'UserAssigned' userAssignedIdentities: { '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {} } } }
이러한 요소를 설정한 후 properties
리소스의 deploymentScripts
섹션으로 이동할 수 있습니다. 섹션의 주요 부분 properties
은 scriptContent
으로서 실행할 실제 스크립트를 지정합니다.
"properties": {
"scriptContent": "
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
",
}
properties: {
scriptContent: '''
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
'''
}
scriptContent
는 여러 줄 문자열을 사용합니다. Bicep에서는 문자열 앞과 뒤에 세 개의 따옴표를 함께 사용하여('''
) 여러 줄 문자열을 지정할 수 있습니다.
배포 스크립트는 출력을 배포에 다시 전달하는 것이 일반적입니다. 예를 들어 스크립트를 사용하여 API에서 일부 정보를 조회하는 경우 정보를 출력으로서 배포에 다시 전달할 수 있습니다. 그런 다음, 배포의 다른 리소스는 자체 정의에서 해당 정보를 사용할 수 있습니다.
PowerShell 스크립트의 경우 해시 테이블이어야 하는 $DeploymentScriptOutputs
라는 변수를 만들어 출력을 다시 전달합니다. 예제 스크립트는 해시 테이블을 초기화한 다음, text
지역 변수에서 해당 값을 사용하는 $output
라는 출력을 만듭니다.
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
팁
Bash에서 배포 스크립트를 작성할 수도 있습니다. Bash 스크립트에서 출력을 만들려면 AZ_SCRIPTS_OUTPUT_PATH
환경 변수로 지정된 위치에 JSON 파일을 만들어야 합니다.
properties
섹션 내에서 deploymentScripts
가 수행할 수 있는 다양한 옵션도 정의합니다. 이 모듈에서는 간단하게 유지하고 스크립트를 실행할 수 있을 만큼 추가합니다. 최소한 사용할 Azure PowerShell 또는 Azure CLI 버전, 실행할 스크립트 및 보존 간격을 제공해야 합니다.
보존 간격은 리소스를 유지하려는 경우 결과를 유지해야 하는 기간입니다. 기본적으로 스크립트를 실행한 후에 결과가 제거됩니다.
"properties": {
"azPowerShellVersion": "3.0",
"scriptContent": "
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
",
"retentionInterval": "P1D"
}
properties: {
azPowerShellVersion: '3.0'
scriptContent: '''
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
'''
retentionInterval: 'P1D'
}
전체 템플릿은 다음과 같습니다.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"apiProfile": "",
"parameters": {},
"variables": {},
"functions": [],
"resources": [
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "myFirstDeploymentScript",
"location": "[resourceGroup().location]",
"kind": "AzurePowerShell",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
}
},
"properties": {
"azPowerShellVersion": "3.0",
"scriptContent": "
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
",
"retentionInterval": "P1D"
}
}
],
"outputs": {
"scriptResult": {
"type": "string",
"value": "[reference('myFirstDeploymentScript').outputs.text]"
}
}
}
resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
name: 'myFirstDeploymentScript'
location: resourceGroup().location
kind: 'AzurePowerShell'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
}
}
properties: {
azPowerShellVersion: '3.0'
scriptContent: '''
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
'''
retentionInterval: 'P1D'
}
}
output scriptResult string = myFirstDeploymentScript.properties.outputs.text
스크립트 파일 포함
템플릿에 인라인으로 스크립트를 포함하는 것은 번거로운 작업이며, 읽기 및 이해하기 어렵고 변경하기 어려울 수 있습니다. Bicep은 loadTextContent()
함수를 사용하여 배포에 외부 텍스트 파일을 포함합니다. Bicep이 템플릿을 JSON으로 변환 컴파일할 때 내보내는 템플릿에 외부 파일을 포함합니다.
Bicep 템플릿과 동일한 폴더에 myscript.ps1 PowerShell 파일이 있다고 가정해 보겠습니다. 다음과 같이 파일을 포함하도록 Bicep에 지시할 수 있습니다.
properties: {
azPowerShellVersion: '3.0'
scriptContent: loadTextContent('myscript.ps1')
retentionInterval: 'P1D'
}