Azure와 함께 하는 DevOps

03 Resource Manager 템플릿에 리소스 추가

zerobig-k8s 2019. 11. 20. 08:24

<참조>

https://docs.microsoft.com/ko-kr/azure/azure-resource-manager/resource-group-overview

https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview

https://docs.microsoft.com/en-us/azure/azure-resource-manager/template-deployment-overview

https://docs.microsoft.com/ko-kr/azure/azure-resource-manager/template-deployment-overview

https://docs.microsoft.com/ko-kr/azure/azure-resource-manager/template-tutorial-add-resource?tabs=azure-powershell

https://docs.microsoft.com/en-us/azure/azure-resource-manager/template-tutorial-add-resource?tabs=azure-powershell

 

 

 

이전 자습서에서는 빈 템플릿을 만들어서 배포하는 방법을 알아보았다. 이제 실제 리소스를 배포할 준비가 되었다.

실제 리소스를 배포하기에 앞서 리소스 관리자와 리소스 관리자 템플릿에 대해 간단하게 정리하고 넘어가보자.

 

 

리소스 관리자 개요

먼저 주요 용어부터 정리하면

  • 리소스 - Azure를 통해 사용할 수 있는 관리 가능한 항목이다. 리소스의 예로는 가상 머신, 스토리지 계정, 웹앱, 데이터베이스 및 가상 네트워크가 있다.
  • 리소스 그룹 - Azure 솔루션에 관련된 리소스를 보유하는 컨테이너다. 리소스 그룹은 그룹으로 관리하려는 리소스만 포함한다. 
  • 리소스 공급자 - Azure 리소스를 제공하는 서비스다. 예를 들어 일반적인 리소스 공급자는 가상 머신 리소스를 제공하는 Microsoft.Compute다. Microsoft.Storage는 또 다른 일반적인 리소스 공급자다. 리소스 공급자 및 형식을 참조한다.
  • 리소스 관리자 템플릿 - 리소스 그룹 또는 구독에 배포한 하나 이상의 리소스를 정의하는 JSON(JavaScript Object Notation) 파일이다. 
  • 선언적(declarative) 구문 - 항목을 만드는 프로그래밍 명령의 시퀀스를 작성하지 않고도 "만들려는 대상은 다음과 같다"라고 선언하는 구문이다. 

 

사용자가 Azure 도구, API 또는 SDK에서 요청을 보내면 리소스 관리자에서 요청을 받아 요청에 대해 인증하고 권한을 부여한다. 리소스 관리자는 요청된 작업을 수행하는 Azure 서비스로 요청을 전송한다. 모든 요청은 동일한 API를 통해 처리되므로, 모든 다른 툴에서 일관된 결과와 기능을 볼 수 있다.

 

리소스 관리자를 사용하면 다음을 수행할 수 있다.

  • 스크립트가 아니라 선언적 템플릿을 통해 인프라를 관리한다.

  • 리소스를 개별적으로 처리하는 대신, 솔루션의 모든 리소스를 그룹으로 배포, 관리 및 모니터링한다.
  • 개발 수명 주기 전체에 걸쳐 솔루션을 다시 배포하고, 리소스가 일관된 상태로 배포된다고 확신할 수 있다.

  • 리소스가 올바른 순서로 배포되도록 리소스 간의 종속성을 정의한다.

  • RBAC(역할 기반 액세스 제어)가 관리 플랫폼에 통합되어 있으므로 액세스 제어가 리소스 그룹의 모든 서비스에 적용된다.

  • 리소스에 태그를 적용하여 구독의 모든 리소스를 논리적으로 구성합니다.

  • 동일한 태그를 공유하는 리소스 그룹에 대한 비용을 확인하여 조직의 청구를 명확히 한다.

 

Azure 리소스 관리자에 대해 더 자세히 알아보려면 여기를 참조한다.

 

 

리소스 관리자 템플릿 개요

클라우드로 전환하면서 많은 팀이 Agile 개발 방법을 채택했으며 인프라가 반복적인 프로세스의 일부가 됨에 따라 운영과 개발 간의 구분이 사라졌다. 팀은 통합 프로세스를 통해 인프라 및 애플리케이션 코드를 관리해야한다.

애플리케이션 프로그램 코드와 마찬가지로 인프라 코드를 소스 리포지토리에 저장하고 버전을 지정한다. 팀의 모든 사람이 코드를 실행하고 유사한 환경을 배포할 수 있다.

리소스 관리자 템플릿을 통해 Azure 인프라를 일관되게 멱등성(idempotent)을 유지한 상태로 선언적 배포를 실현할 수 있다. 

템플릿은 유효성 검사를 통과한 후에만 배포가 되기때문에 배포의 신뢰성이 확보된다.

 

리소스 관리자 템플릿에 대해 더 자세히 알아보려면 여기를 참조한다.

이제부터 본격적으로 리소스 관라자 템플릿을 통해 리소스를 추가/배포 해보자.

 

 

필수 조건

Resource Manager Tools 확장이 포함된 Visual Studio Code 및 Azure PowerShell 또는 Azure CLI가 있어야 한다.

 

우리는 이전 실습을 통해 PowerShell과 Azure CLI를 통해 Azure 리소스를 배포해 보았다.

편의상 윈도우즈 환경의 PowerShell Core 터미널에서 두 가지 배포 실습을 모두 시행했다. 그런데 이후 실습 과정에서 PowerShell Core 터미널 창에서 az 관련 명령어 인식 및 호환성 등의 번거로움을 겪게 된다.

이러한 번거로움을 피하기 위해 WSL(Windows Subsystem for Linux) 설치 페이지로 이동하여 설치를 진행하도록 하겠다.

 

만약 자신의 리눅스 환경에 Azure CLI를 설치하여 실습을 진행하고자 한다면 리눅스 Azure CLI 설치를 참조한다.

 

 

 

리소스 추가

이 자습서에서는 스토리지 계정을 추가한다.

기존 템플릿에 스토리지 계정 정의를 추가하려면 다음 예제에 강조 표시되어 있는 JSON을 살펴본다. 템플릿의 섹션을 복사하는 대신 전체 파일을 복사하고 해당 내용으로 템플릿을 바꾼다.

{provide-unique-name} 을 고유한 스토리지 계정 이름으로 바꾼다. 스토리지 계정 이름은 Azure 내에서 고유해야 한다. 이름에는 소문자 또는 숫자만 사용할 수 있으며 24자 이하여야 한다. store1을 접두사로 사용하고 이니셜과 오늘 날짜를 추가하는 이름 지정 패턴을 시도해 볼 수 있다. 예를 들어 store1abc09092019와 같은 이름을 사용할 수 있다.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2019-04-01",
            "name": "zeroteststg",
            "location": "koreacentral",
            "sku": {
                "name": "Standard_LRS"
            },
            "kind": "StorageV2",
            "properties": {
                "supportsHttpsTrafficOnly": true
            }
        }
    ]
}

스토리지 계정에 대한 고유 이름을 추측하는 것은 쉽지 않으며 대량 배포를 자동화하는 데 적합하지 않다. 이 자습서 시리즈의 뒷부분에서 고유한 이름을 쉽게 만들 수 있는 템플릿 기능을 사용한다.

 

 

리소스 속성

각 리소스 종류에 사용할 속성을 찾는 방법이 궁금할 수 있다. Resource Manager 템플릿 참조를 사용하여 배포하려는 리소스 종류를 찾을 수 있다.

배포하는 모든 리소스에는 최소한 다음 세 가지 속성이 있다.

  • type: 리소스 유형이다. 이 값은 리소스 공급자의 네임스페이스와 리소스 유형의 조합(예: Microsoft.Storage/storageAccounts)이다.
  • apiVersion: 리소스를 만들 때 사용하는 REST API의 버전이다. 각 리소스 공급자는 자체 API 버전을 게시했으므로, 이 값은 유형에 따라 다르다.
  • name: 리소스의 이름이다.

대부분의 리소스에는 location 속성이 있으며, 이 속성은 리소스가 배포되는 지역을 설정한다.

다른 속성은 리소스 유형 및 API 버전에 따라 다르다. API 버전과 사용 가능한 속성 간의 연결을 이해하는 것이 중요하므로 좀 더 자세히 살펴보겠다.

이 자습서에서는 템플릿에 스토리지 계정을 추가했다. storageAccounts 2019-04-01에서 해당 API 버전을 확인할 수 있다. 템플릿에 모든 속성을 추가하지는 않았다. 많은 속성은 선택 사항이다. Microsoft.Storage 리소스 공급자가 새로운 API 버전을 출시할 수 있지만, 배포 중인 버전을 변경할 필요는 없다. 해당 버전을 계속 사용하고 배포 결과가 일관적이라는 것을 확인할 수 있다.

storageAccounts 2016-05-01와 같은 이전 API 버전이 보이는 경우, 더 작은 속성 집합을 사용할 수 있다.

리소스의 API 버전을 변경하려는 경우에는, 해당 버전의 속성을 평가하고 템플릿을 적절히 조정해야 한다.

 

 

 

템플릿 배포

템플릿을 배포하여 스토리지 계정을 만들 수 있다. 배포에 다른 이름을 지정하면 기록에서 쉽게 찾을 수 있다.

리소스 그룹을 만들지 않은 경우 리소스 그룹 만들기를 참조한다. 이 예제에서는 이전 자습서에서와 같이templateFile 변수를 템플릿 파일의 경로로 설정했다고 가정한다.

 

실습 디렉토리에서 탐색기 메뉴 중 Open with Code를 선택해 VS Code를 연다.

Ctrl + Shift + p를 누르고 화면 상단 터미널 선택 창에서 PowerShell Core를 선택하여 shell을 구동한다.

powershell.ps1 이라는 파일을 생성하여 다음 코드를 붙여 넣는다.

$resourceGroup 이나 $templateFile은 각자 상황에 맞게 수정하여 저장한다.

참고로 02 첫 번째 Azure Resource Manager 템플릿을 만들고 배포 실습을 수행하고 나서 시간이 지난 뒤 지금 실습을 수행할 경우를 감안해서 코드를 일부 수정한 것이다.

$location = "koreacentral"
$resourceGroup = "zeroRG"
New-AzResourceGroup -Name $resourceGroup -Location $location

$templateFile = "C:\AzureDevOps-Excercise\azuredeploy.json"
New-AzResourceGroupDeployment `
  -Name zeroteststg `
  -ResourceGroupName $resourceGroup `
  -TemplateFile $templateFile

 

위 코드 전체를 선택하고 F8을 눌러 코드를 실행한다.

이상이 없다면 ProvisioningState가 Succeeded 상태로 확인 될 것이다.

PS C:\AzureDevOps-Excercise> $location = "koreacentral"
$resourceGroup = "zeroRG"
New-AzResourceGroup -Name $resourceGroup -Location $location

$templateFile = "C:\AzureDevOps-Excercise\azuredeploy.json"
New-AzResourceGroupDeployment `
  -Name zeroteststg `
  -ResourceGroupName $resourceGroup `
  -TemplateFile $templateFile
Confirm
Provided resource group already exists. Are you sure you want to update it?
[Y] Yes [N] No [S] Suspend [?] Help (default is "Yes"):

ResourceGroupName : zeroRG
Location          : koreacentral
ProvisioningState : Succeeded
Tags              :
ResourceId        : /subscriptions/2e5d848e-xxxx-xxxx-xxxx-fd25ae915bcd/resourceGroups/zeroRG


ResourceGroupName       : zeroRG
OnErrorDeployment       :
DeploymentName          : zeroteststg
CorrelationId           : 57bc2c49-xxxx-xxxx-xxxx-c7f9ddad73f4
ProvisioningState       : Succeeded
Timestamp               : 11/19/2019 1:51:08 PM
Mode                    : Incremental
TemplateLink            :
TemplateLinkString      :
DeploymentDebugLogLevel :
Parameters              :
ParametersString        :
Outputs                 :
OutputsString           :



PS C:\AzureDevOps-Exercise> :

 

터미널 창 우측 셀렉트 박스에 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 zerobigteststg \
  --resource-group $resourceGroup \
  --template-file $templateFile

 

위 코드 전체를 선택하고 Ctrl + '를 눌러 코드를 실행한다.

이상이 없다면 "provisioningState": "Succeeded" 상태로 확인 될 것이다.

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 zerobigteststg \
>   --resource-group $resourceGroup \
>   --template-file $templateFile
{
  "id": "/subscriptions/2e5d848e-xxxx-xxxx-xxxx-fd25ae915bcd/resourceGroups/zerobigRG/providers/Microsoft.Resources/deployments/zerobigteststg",
  "location": null,
  "name": "zerobigteststg",
  "properties": {
    "correlationId": "66d3f160-xxxx-xxxx-xxxx-ba01aa4c4963",
    "debugSetting": null,
    "dependencies": [],
    "duration": "PT32.5953943S",
    "mode": "Incremental",
    "onErrorDeployment": null,
    "outputResources": [
      {
        "id": "/subscriptions/2e5d848e-xxxx-xxxx-xxxx-fd25ae915bcd/resourceGroups/zerobigRG/providers/Microsoft.Storage/storageAccounts/zerobigteststg",
        "resourceGroup": "zerobigRG"
      }
    ],
    "outputs": null,
    "parameters": null,
    "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"
          }
        ]
      }
    ],
    "provisioningState": "Succeeded",
    "template": null,
    "templateHash": "7074610317245045684",
    "templateLink": null,
    "timestamp": "2019-11-19T14:31:05.391721+00:00"
  },
  "resourceGroup": "zerobigRG",
  "type": "Microsoft.Resources/deployments"
}
zerobig@zerovmw10:/mnt/c/AzureDevOps-Excercise$

 

위 코드 실행 중 발생할 수 있는 두 가지 배포 오류는 다음과 같다.

  • 오류: Code=AccountNameInvalid; Message={provide-unique-name}은 유효한 스토리지 계정 이름이 아니다. 스토리지 계정 이름은 3자에서 24자 사이여야 하며 숫자와 소문자만 사용해야 한다.

    템플릿에서 {provide-unique-name} 을 고유한 스토리지 계정 이름으로 바꾼다. 리소스 추가를 참조한다.

  • 오류: Code=StorageAccountAlreadyTaken; Message=store1abc09092019라는 스토리지 계정이 이미 사용되었다.

    템플릿에서 다른 스토리지 계정 이름을 시도해 본다.

이 배포는 스토리지 계정이 생성되기 때문에 빈 템플릿 배포보다 시간이 오래 걸린다. 약 1분 정도 걸릴 수 있지만 일반적으로 더 빠르다.

 

 

 

배포 확인

Azure Portal에서 리소스 그룹을 탐색하여 배포를 확인할 수 있다.

  1. Azure Portal에 로그인한다.
  2. 왼쪽 메뉴에서 리소스 그룹을 선택한다.
  3. 배포한 리소스 그룹을 선택한다.
  4. 스토리지 계정이 배포된 것을 볼 수 있다.

   5. 배포 레이블이 이제 다음과 같이 표시된다.  Deployments: 1 Succeeded.

 

 

 

리소스 정리

다음 자습서로 이동하는 경우에는 리소스 그룹을 삭제할 필요가 없다.

지금 중지하는 경우에는 리소스 그룹을 삭제하여 배포된 리소스를 정리하는 것이 좋다.

  1. Azure Portal의 왼쪽 메뉴에서 리소스 그룹을 선택한다.
  2. 이름으로 필터링 필드에서 리소스 그룹 이름을 입력한다.
  3. 해당 리소스 그룹 이름을 선택한다.
  4. 위쪽 메뉴에서 리소스 그룹 삭제를 선택한다.