연습 - ARM 템플릿에 조건부 논리 추가
이전 연습에서는 Linux 가상 머신으로 작업했습니다. 여기서는 스토리지 계정 관리에 집중합니다.
다음과 같이 세 가지 환경에 배포해야 한다고 가정해 보겠습니다. 개발, 스테이징, 프로덕션.
- 개발 환경은 애플리케이션에 필요한 모든 것이 함께 제공되는 첫 번째 위치입니다. 이 환경에는 웹 서버, 부하 분산 장치, 데이터베이스가 포함될 수 있습니다.
- 스테이징 환경에서는 최종 사용자에게 새로운 애플리케이션 기능을 출시하기 전에 최종 테스트가 수행됩니다.
- 프로덕션 환경에서는 최종 사용자가 애플리케이션에 액세스합니다.
개발 환경에서 프로덕션 환경으로 전환할 때 추가 인프라가 필요합니다. 예를 들어 프로덕션 환경에서는 이전 환경에서 필요하지 않던 추가 스토리지 계정이 필요합니다.
여기서는 조건을 사용하여 스토리지 계정이 프로비전되는 시기를 제어합니다. 이렇게 하면 동일한 ARM 템플릿에서 각 인프라 환경을 지원할 수 있습니다.
ARM 템플릿 만들기
여기서는 스토리지 계정 리소스를 정의하는 ARM(Azure Resource Manager) 템플릿을 만듭니다.
이 템플릿은 다음 두 개의 매개 변수도 정의합니다.
environment
: 현재 환경의 이름입니다.storageAccountName
; 스토리지 계정에 사용할 이름입니다.
environment
의 값은 dev
, staging
, production
의 세 가지 중 하나일 수 있습니다. 조건은 environment
가 production
과 같은 경우에만 스토리지 계정을 프로비저닝합니다.
Visual Studio Code의 azuredeploy.json이 포함된 디렉터리에서 condition.json이라는 파일을 만듭니다.
condition.json에 다음 내용을 추가합니다.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
여기서는 PowerShell 및 Az 모듈에서 condition 구문을 사용하여 ARM 템플릿을 배포합니다.
개발 환경 프로비전
여기서는 ARM 템플릿을 개발 환경에 배포합니다. 이렇게 하려면 environment
템플릿 매개 변수를 dev
로 설정합니다.
조건은 environment
가 production
과 같은 경우에만 스토리지 계정을 프로비전하기 때문에 템플릿이 스토리지 계정을 프로비저닝하지 않을 것으로 간주합니다. 즉, 리소스를 포함하지 않는 배포를 예상합니다.
스토리지 계정 이름을 포함하는 PowerShell 변수를 만듭니다.
$STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
스토리지 계정 이름은 고유해야 합니다.
Get-Random
부분은 스토리지 계정 이름이 난수로 끝나도록 합니다.다음
New-AzResourceGroupDeployment
명령을 실행하여 템플릿을 개발 환경에 배포합니다.New-AzResourceGroupDeployment ` -TemplateFile "./condition.json" ` -storageAccountName $STORAGE_ACCT_NAME ` -environment dev
개발 환경 배포 확인
앞서 템플릿이 스토리지 계정을 프로비전하지 않을 것을 간주했습니다.
이 사실을 확인하려면 Get-AzStorageAccount
명령을 실행하여 스토리지 계정 이름이 이미 사용 중인지 확인합니다.
Get-AzStorageAccount
명령을 실행합니다.
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
출력은 다음과 비슷합니다.
Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
이를 통해 스토리지 계정이 아직 프로비저닝되지 않은 것을 알 수 있습니다. 이는 프로덕션 환경에는 아직 배포하지 않았기 때문에 예상된 결과입니다.
프로덕션 환경 프로비전
여기서는 ‘개발’ 환경에 수행한 방법과 비슷하게 ARM 템플릿을 프로덕션 환경에 배포합니다.
기억하겠지만 조건은 템플릿에서 다음과 같이 나타납니다.
"condition": "[equals(parameters('environment'),'production')]"
이 조건을 트리거하려면 environment
템플릿 매개 변수를 production
으로 설정합니다.
다음 New-AzResourceGroupDeployment
명령을 실행하여 프로덕션 환경에 템플릿을 배포합니다.
New-AzResourceGroupDeployment `
-TemplateFile "./condition.json" `
-storageAccountName $STORAGE_ACCT_NAME `
-environment production
프로덕션 환경 배포 확인
이번에는 템플릿이 스토리지 계정을 프로비전했을 것으로 간주합니다.
이 사실을 확인하려면 Get-AzStorageAccount
명령을 다시 실행하여 스토리지 계정 이름이 사용 중인지 확인합니다.
다음 Get-AzStorageAccount
명령을 실행합니다.
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
이번에는 다른 출력이 얻어집니다. 오류 메시지 대신 다음과 같이 스토리지 계정 리소스에 대한 정보를 표시하는 테이블 출력을 보여 줍니다.
출력은 다음과 비슷합니다.
Location Name Type Kind
-------- ---- ---- ----
westus tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2
이러한 값을 통해 스토리지 계정이 정상적으로 프로비전되었음을 알 수 있습니다.
이것은 기본적인 예제이지만 조건에 따라 배포하는 방법을 확인할 수 있습니다.
실제로 개발, 스테이징 및 프로덕션 환경에는 컴퓨팅, 네트워킹 및 스토리지 요구 사항을 지원하기 위한 추가 Azure 리소스가 포함되어 있습니다. 각 환경은 단일 단위로 프로비전하고 처리하도록 자체 리소스 그룹을 통해 관리할 수 있습니다.
ARM 템플릿 만들기
여기서는 스토리지 계정 리소스를 정의하는 ARM(Azure Resource Manager) 템플릿을 만듭니다.
이 템플릿은 다음 두 개의 매개 변수도 정의합니다.
environment
: 현재 환경의 이름입니다.storageAccountName
; 스토리지 계정에 사용할 이름입니다.
environment
의 값은 dev
, staging
, production
의 세 가지 중 하나일 수 있습니다. 조건은 environment
가 production
과 같은 경우에만 스토리지 계정을 프로비저닝합니다.
Visual Studio Code의 azuredeploy.json이 포함된 디렉터리에서 condition.json이라는 파일을 만듭니다.
condition.json에 다음 내용을 추가합니다.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
개발 환경 프로비전
여기서는 ARM 템플릿을 개발 환경에 배포합니다. 이렇게 하려면 environment
템플릿 매개 변수를 dev
로 설정합니다.
조건은 environment
가 production
과 같은 경우에만 스토리지 계정을 프로비전하기 때문에 템플릿이 스토리지 계정을 프로비저닝하지 않을 것으로 간주합니다. 즉, 리소스를 포함하지 않는 배포를 예상합니다.
스토리지 계정 이름을 포함하는 Bash 변수를 만듭니다.
STORAGE_ACCT_NAME=tailwindsa$RANDOM
스토리지 계정 이름은 고유해야 합니다.
$RANDOM
부분은 스토리지 계정 이름이 난수로 끝나도록 합니다.다음
az deployment group create
명령을 실행하여 템플릿을 개발 환경에 배포합니다.az deployment group create \ --template-file condition.json \ --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
개발 환경 배포 확인
앞서 템플릿이 스토리지 계정을 프로비전하지 않을 것을 간주했습니다.
이 사실을 확인하려면 az storage account check-name
명령을 실행하여 스토리지 계정 이름이 이미 사용 중인지 확인합니다.
다음 az storage account check-name
명령을 실행합니다.
az storage account check-name --name $STORAGE_ACCT_NAME
다음과 같은 내용이 표시됩니다.
{
"message": null,
"nameAvailable": true,
"reason": null
}
nameAvailable
값은 true
입니다. 즉, 이 스토리지 계정 이름은 여전히 사용할 수 있으며 아직 프로비저닝되지 않은 것입니다. 이는 프로덕션 환경에는 아직 배포하지 않았기 때문에 예상된 결과입니다.
프로덕션 환경 프로비전
여기서는 ‘개발’ 환경에 수행한 방법과 비슷하게 ARM 템플릿을 프로덕션 환경에 배포합니다.
기억하겠지만 조건은 템플릿에서 다음과 같이 나타납니다.
"condition": "[equals(parameters('environment'),'production')]"
이 조건을 트리거하려면 environment
템플릿 매개 변수를 production
으로 설정합니다.
다음 az deployment group create
명령을 실행하여 프로덕션 환경에 템플릿을 배포합니다.
az deployment group create \
--template-file condition.json \
--parameters storageAccountName=$STORAGE_ACCT_NAME environment=production
프로덕션 환경 배포 확인
이번에는 템플릿이 스토리지 계정을 프로비전했을 것으로 간주합니다.
이 사실을 확인하려면 az storage account check-name
명령을 다시 실행하여 스토리지 계정 이름이 사용 중인지 확인합니다.
다음 az storage account check-name
명령을 실행합니다.
az storage account check-name --name $STORAGE_ACCT_NAME
출력은 다음과 비슷합니다.
{
"message": "The storage account named tailwindsa32100 is already taken.",
"nameAvailable": false,
"reason": "AlreadyExists"
}
이러한 값을 통해 스토리지 계정이 정상적으로 프로비전되었음을 알 수 있습니다.
이것은 기본적인 예제이지만 조건에 따라 배포하는 방법을 확인할 수 있습니다.
실제로 개발, 스테이징 및 프로덕션 환경에는 컴퓨팅, 네트워킹 및 스토리지 요구 사항을 지원하기 위한 추가 Azure 리소스가 포함되어 있습니다. 각 환경은 단일 단위로 프로비전하고 처리하도록 자체 리소스 그룹을 통해 관리할 수 있습니다.