배포 스크립트란?
이 단원에서는 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 container instance에서 실행합니다. 해당 컨테이너 인스턴스에는 사용자가 제공하는 관리 ID가 할당됩니다. 스크립트 및 해당 출력은 Azure Storage 계정의 파일 공유에 저장됩니다.
템플릿 배포가 실행되면 대상 리소스 그룹에 기존 deploymentScripts
리소스가 있는지 확인합니다. 이러한 리소스가 있으면 속성을 비교합니다. 모든 것이 일치하면 새로운 작업이 발생하지 않습니다. 리소스가 없거나 변경된 경우 Azure Resource Manager는 새 컨테이너 인스턴스를 만들고 해당 컨테이너 인스턴스 내에서 배포 스크립트를 실행합니다. 정의된 출력은 배포의 뒷부분에서 사용하기 위해 Azure Resource Manager로 다시 전달됩니다.
배포 스크립트 구조
ARM 템플릿에 사용자 지정 동작을 추가하려면 deploymentScripts
리소스로 시작합니다. 최소한 다음과 같은 일반적인 세부 정보를 제공해야 합니다.
deploymentScripts
리소스의name
입니다.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': {} } } }
이러한 요소를 설정한 후 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
라는 변수를 만들어 출력을 다시 전달합니다. 예제 스크립트는 해시 테이블을 초기화한 다음, $output
지역 변수에서 해당 값을 사용하는 text
라는 출력을 만듭니다.
$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'
}
ARM 템플릿 참조 설명서에서 deploymentScripts
리소스에 대한 모든 속성을 찾을 수 있습니다.