티스토리 뷰
<참조>
이전 자습서에서는 템플릿에 함수를 추가하여 템플릿을 개선하는 방법을 알아 보았다. 이 자습서에서는 템플릿에 변수를 추가하는 방법을 알아본다. 변수는 식을 한 번 작성하고 템플릿 전체에서 다시 사용할 수 있도록 하여 템플릿을 간소화한다.
더불어 템플릿의 값을 반환하는 방법을 함께 알아본다. 배포된 리소스의 값이 필요한 경우 출력을 사용한다.
이 자습서 시리즈에서는 Azure 스토리지 계정을 배포하는 템플릿을 만들었다. 다음 두 자습서에서는 App Service 계획과 웹 사이트를 추가한다. 템플릿을 처음부터 생성하는 대신 Azure Portal에서 템플릿을 내보내는 방법과 Azure 빠른 시작 템플릿에서 샘플 템플릿을 사용하는 방법을 알아본다.
필수 조건
Resource Manager Tools 확장이 포함된 Visual Studio Code 및 Azure PowerShell 또는 Azure CLI가 있어야 한다.
준비가 안되었다면, Azure 실습을 위한 Visual Studio Code 환경 구성과 Linux용 Windows 하위 시스템 설치를 참고하여 실습 준비를 마친다.
템플릿 검토
다음은 이전 자습서에서 활용한 템플릿이다.
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "storagePrefix": { "type": "string", "minLength": 3, "maxLength": 11 }, "storageSKU": { "type": "string", "defaultValue": "Standard_LRS", "allowedValues": [ "Standard_LRS", "Standard_GRS", "Standard_RAGRS", "Standard_ZRS", "Premium_LRS", "Premium_ZRS", "Standard_GZRS", "Standard_RAGZRS" ] }, "location": { "type": "string", "defaultValue": "[resourceGroup().location]" } }, "variables": { "uniqueStorageName": "[concat(parameters('storagePrefix'), uniqueString(resourceGroup().id))]" }, "resources": [ { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-04-01", "name": "[variables('uniqueStorageName')]", "location": "[parameters('location')]", "sku": { "name": "[parameters('storageSKU')]" }, "kind": "StorageV2", "properties": { "supportsHttpsTrafficOnly": true } } ], "outputs": { "storageEndpoint": { "type": "object", "value": "[reference(variables('uniqueStorageName')).primaryEndpoints]" } } } |
이 템플릿은 스토리지 계정 배포에 적합하지만 더 많은 리소스를 추가할 수 있다. 기존 리소스에서 템플릿을 내보내서 해당 리소스의 JSON을 빠르게 가져올 수 있다.
App Service 플랜 만들기
1. Azure Portal에 로그인합니다.
2. 리소스 만들기를 선택합니다.
3. Marketplace 검색에 App Service plan을 입력한 다음, 다음과 같이 Services의 App Service plan을 선택한다.
4. Create app service plan을 선택한다.
5. 다음과 같이 입력한다.
- Subscription: Azure 구독을 선택한다.
- Resource Group: Create New를 선택한 후 이름을 지정한다.
- Name: App Service Plan의 이름을 입력한다.
- Operating System: Linux를 선택한다.
- Region: Azure 위치를 선택한다.
6. Review and Create를 선택한다.
7. Create를 선택한다. 만드는 데 몇 분 정도 걸린다.
템플릿 내보내기
1. Go to resource를 선택한다.
템플릿 내보내기 기능은 리소스의 현재 상태를 가져와서 해당 리소스를 배포할 템플릿을 생성한다. 템플릿을 내보내면 리소스를 배포하는 데 필요한 JSON을 신속하게 가져올 수 있다.
## 중요 ##
일반적으로 내보낸 템플릿은 템플릿을 만들 때 필요한 것보다 더 자세한 정보를 포함한다. 예를 들어, 내보낸 템플릿의 SKU 개체에는 5개의 속성이 있다. 이 템플릿을 사용해도 괜찮지만 name 속성만 사용할 수 있다. 내보낸 템플릿으로 시작한 다음, 요구 사항에 맞게 원하는 대로 수정할 수 있다.
기존 템플릿 수정
내보낸 템플릿에는 필요한 JSON이 대부분 제공되지만 템플릿에 맞게 사용자 지정해야 한다. 사용자의 템플릿과 내보낸 템플릿 간에 매개 변수와 변수의 차이점에 특히 주의해야 한다. 물론, 내보내기 프로세스는 템플릿에 이미 정의해 놓은 매개 변수와 변수를 알지 못한다.
다음 예제는 템플릿에 추가된 내용을 강조 표시한다. 여기에는 내보낸 코드와 일부 변경 내용이 포함된다. 첫째, 매개변수 이름을 명명 규칙과 일치하도록 변경한다. 둘째, 위치 매개 변수를 App Service 계획의 위치에 사용한다. 셋째, properties 개체 내부의 name을 제거한다. 이 값은 리소스 수준의 name 속성과 중복되기 때문이다.
전체 파일을 복사하고 템플릿을 해당 콘텐츠로 바꾼다.
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "storagePrefix": { "type": "string", "minLength": 3, "maxLength": 11 }, "storageSKU": { "type": "string", "defaultValue": "Standard_LRS", "allowedValues": [ "Standard_LRS", "Standard_GRS", "Standard_RAGRS", "Standard_ZRS", "Premium_LRS", "Premium_ZRS", "Standard_GZRS", "Standard_RAGZRS" ] }, "location": { "type": "string", "defaultValue": "[resourceGroup().location]" }, "appServicePlanName": { "type": "string", "defaultValue": "exampleplan" } }, "variables": { "uniqueStorageName": "[concat(parameters('storagePrefix'), uniqueString(resourceGroup().id))]" }, "resources": [ { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-04-01", "name": "[variables('uniqueStorageName')]", "location": "[parameters('location')]", "sku": { "name": "[parameters('storageSKU')]" }, "kind": "StorageV2", "properties": { "supportsHttpsTrafficOnly": true } }, { "type": "Microsoft.Web/serverfarms", "apiVersion": "2016-09-01", "name": "[parameters('appServicePlanName')]", "location": "[parameters('location')]", "sku": { "name": "P1v2", "tier": "PremiumV2", "size": "P1v2", "family": "Pv2", "capacity": 1 }, "kind": "linux", "properties": { "perSiteScaling": false, "maximumElasticWorkerCount": 1, "isSpot": false, "reserved": true, "isXenon": false, "hyperV": false, "targetWorkerCount": 0, "targetWorkerSizeId": 0 } } ], "outputs": { "storageEndpoint": { "type": "object", "value": "[reference(variables('uniqueStorageName')).primaryEndpoints]" } } } |
템플릿 배포
템플릿을 배포한다. 스토리지 이름의 접두사만 제공하기 때문에 이 템플릿을 이전 템플릿보다 쉽게 배포할 수 있다.
실습 디렉토리에서 탐색기 메뉴 중 Open with Code를 선택해 VS Code를 연다.
Ctrl + Shift + p를 누르고 화면 상단 터미널 선택 창에서 PowerShell Core를 선택하여 shell을 구동한다.
기존 powershell.ps1 이라는 파일을 이용하거나 새로 하나 생성하여 다음 코드를 붙여 넣는다.
위 함수 사용 섹션의 azuredeploy.json 코드도 기존 파일에 덮어 쓰거나 새로 하나 생성하여 붙여 넣는다.
$resourceGroup 이나 $templateFile은 각자 상황에 맞게 수정하고 -storageName의 값은 중복되지 않는 임의의 값으로 정해 입력해 준다.
참고로 이전 실습에서 생성되었던 리소스 그룹(zeroRG)은 모두 정리되었다고 가정하지만 정리가 안되었더라도 코드 실행과정에서 업데이트 여부를 물을 때 Y(기본값)를 눌러 진행하면 된다.
$location = "koreacentral" $resourceGroup = "zeroRG" New-AzResourceGroup -Name $resourceGroup -Location $location $templateFile = "C:\AzureDevOps-Excercise\azuredeploy.json" New-AzResourceGroupDeployment ` -Name addappserviceplan ` -ResourceGroupName $resourceGroup ` -TemplateFile $templateFile ` -storagePrefix "store" ` -storageSKU Standard_LRS |
위 코드 전체를 선택하고 F8을 눌러 코드를 실행한다.
이상이 없다면 ProvisioningState가 Succeeded 상태로 확인 될 것이다.
PS C:\AzureDevOps-Excercise> $location = "koreacentral"
PS C:\AzureDevOps-Excercise> $resourceGroup = "zeroRG"
PS C:\AzureDevOps-Excercise> New-AzResourceGroup -Name $resourceGroup -Location $location
ResourceGroupName : zeroRG
Location : koreacentral
ProvisioningState : Succeeded
Tags :
ResourceId : /subscriptions/2e5d848e-xxxx-xxxx-xxxx-fd25ae915bcd/resourceGroups/zeroRG
PS C:\AzureDevOps-Excercise>
PS C:\AzureDevOps-Excercise> $templateFile = "C:\AzureDevOps-Excercise\azuredeploy.json"
PS C:\AzureDevOps-Excercise> New-AzResourceGroupDeployment `
>> -Name addappserviceplan `
>> -ResourceGroupName $resourceGroup `
>> -TemplateFile $templateFile `
>> -storagePrefix "store" `
>> -storageSKU Standard_LRS
DeploymentName : addappserviceplan
ResourceGroupName : zeroRG
ProvisioningState : Succeeded
Timestamp : 12/4/2019 1:25:29 PM
Mode : Incremental
TemplateLink :
Parameters :
Name Type Value
==================== ========================= ==========
storagePrefix String store
storageSKU String Standard_LRS
location String koreacentral
appServicePlanName String exampleplan
Outputs :
Name Type Value
================= ========================= ==========
storageEndpoint Object {
"dfs": "https://storece5bz5okhoqqg.dfs.core.windows.net/",
"web": "https://storece5bz5okhoqqg.z12.web.core.windows.net/",
"blob": "https://storece5bz5okhoqqg.blob.core.windows.net/",
"queue": "https://storece5bz5okhoqqg.queue.core.windows.net/",
"table": "https://storece5bz5okhoqqg.table.core.windows.net/",
"file": "https://storece5bz5okhoqqg.file.core.windows.net/"
}
DeploymentDebugLogLevel :
PS C:\AzureDevOps-Excercise>
터미널 창 우측 셀렉트 박스에 wsl을 선택한다.
없다면, Select Default Shell을 선택한다. 상단에 wsl을 선택할 수 있도록 가용한 shell 리스트가 나열될 것이며 그 중에서 WSL Bash를 선택한다.
현재 실습 디렉토리 내 azurecli.azcli라는 파일을 만들고 다음 코드를 붙여 넣는다.
각자의 상황에 맞게 resourceGroup과 templateFile 등의 값을 수정하여 저장한다.
resourceGroup="zerobigRG" location="koreacentral" az group create \ --resource-group $resourceGroup \ --location $location templateFile="/mnt/c/AzureDevOps-Excercise/azuredeploy.json" az group deployment create \ --name addappserviceplan \ --resource-group $resourceGroup \ --template-file $templateFile \ --parameters storagePrefix=store storageSKU=Standard_LRS |
위 코드 전체를 선택하고 Ctrl + '를 눌러 코드를 실행한다.
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$ resourceGroup="zerobigRG"
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$ location="koreacentral"
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$ az group create \
> --resource-group $resourceGroup \
> --location $location
{
"id": "/subscriptions/2e5d848e-xxxx-xxxx-xxxx-fd25ae915bcd/resourceGroups/zerobigRG",
"location": "koreacentral",
"managedBy": null,
"name": "zerobigRG",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$ templateFile="/mnt/c/AzureDevOps-Excercise/azuredeploy.json"
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$ az group deployment create \
> --name addappserviceplan \
> --resource-group $resourceGroup \
> --template-file $templateFile \
> --parameters storagePrefix=store storageSKU=Standard_LRS
{
"id": "/subscriptions/2e5d848e-xxxx-xxxx-xxxx-fd25ae915bcd/resourceGroups/zerobigRG/providers/Microsoft.Resources/deployments/addappserviceplan",
"location": null,
"name": "addappserviceplan",
"properties": {
"correlationId": "029f3799-xxxx-xxxx-xxxx-63ec29db3a2f",
"debugSetting": null,
"dependencies": [],
"duration": "PT5M34.0176191S",
"mode": "Incremental",
"onErrorDeployment": null,
"outputResources": [
{
"id": "/subscriptions/2e5d848e-xxxx-xxxx-xxxx-fd25ae915bcd/resourceGroups/zerobigRG/providers/Microsoft.Storage/storageAccounts/storei3vprrc4ufywu",
"resourceGroup": "zerobigRG"
},
{
"id": "/subscriptions/2e5d848e-xxxx-xxxx-xxxx-fd25ae915bcd/resourceGroups/zerobigRG/providers/Microsoft.Web/serverfarms/exampleplan",
"resourceGroup": "zerobigRG"
}
],
"outputs": {
"storageEndpoint": {
"type": "Object",
"value": {
"blob": "https://storei3vprrc4ufywu.blob.core.windows.net/",
"dfs": "https://storei3vprrc4ufywu.dfs.core.windows.net/",
"file": "https://storei3vprrc4ufywu.file.core.windows.net/",
"queue": "https://storei3vprrc4ufywu.queue.core.windows.net/",
"table": "https://storei3vprrc4ufywu.table.core.windows.net/",
"web": "https://storei3vprrc4ufywu.z12.web.core.windows.net/"
}
}
},
"parameters": {
"appServicePlanName": {
"type": "String",
"value": "exampleplan"
},
"location": {
"type": "String",
"value": "koreacentral"
},
"storagePrefix": {
"type": "String",
"value": "store"
},
"storageSKU": {
"type": "String",
"value": "Standard_LRS"
}
},
"parametersLink": null,
"providers": [
{
"id": null,
"namespace": "Microsoft.Storage",
"registrationPolicy": null,
"registrationState": null,
"resourceTypes": [
{
"aliases": null,
"apiVersions": null,
"capabilities": null,
"locations": [
"koreacentral"
],
"properties": null,
"resourceType": "storageAccounts"
}
]
},
{
"id": null,
"namespace": "Microsoft.Web",
"registrationPolicy": null,
"registrationState": null,
"resourceTypes": [
{
"aliases": null,
"apiVersions": null,
"capabilities": null,
"locations": [
"koreacentral"
],
"properties": null,
"resourceType": "serverfarms"
}
]
}
],
"provisioningState": "Succeeded",
"template": null,
"templateHash": "7805097836912387979",
"templateLink": null,
"timestamp": "2019-12-04T13:25:31.391070+00:00"
},
"resourceGroup": "zerobigRG",
"type": "Microsoft.Resources/deployments"
}
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$
배포 확인
Azure Portal에서 리소스 그룹을 탐색하여 배포를 확인할 수 있다.
- Azure Portal에 로그인한다.
- 왼쪽 메뉴에서 리소스 그룹을 선택한다.
- 배포한 리소스 그룹을 선택한다.
- 리소스 그룹에 스토리지 계정과 App Service 계획이 포함되어 있는 것을 확인할 수 있다.
리소스 정리
다음 자습서로 이동하는 경우에는 리소스 그룹을 삭제할 필요가 없다.
지금 중지하는 경우에는 리소스 그룹을 삭제하여 배포된 리소스를 정리하는 것이 좋다.
- Azure Portal의 왼쪽 메뉴에서 리소스 그룹을 선택한다.
- 이름으로 필터링 필드에서 리소스 그룹 이름을 입력한다.
- 해당 리소스 그룹 이름을 선택한다.
- 위쪽 메뉴에서 리소스 그룹 삭제를 선택한다.
'Azure와 함께 하는 DevOps' 카테고리의 다른 글
09 Resource Manager 템플릿에 태그 추가 (0) | 2019.12.12 |
---|---|
08 Azure 빠른 시작 템플릿 사용 (0) | 2019.12.09 |
06 Resource Manager 템플릿에 변수와 출력 추가 (0) | 2019.12.02 |
05 Resource Manager 템플릿에 템플릿 함수 추가 (0) | 2019.11.28 |
04 Resource Manager 템플릿에 매개변수 추가 (0) | 2019.11.25 |