ARM 템플릿 및 Azure CLI를 통해 리소스 배포Deploy resources with ARM templates and Azure CLI

이 문서에서는 ARM(Azure 리소스 관리자) 템플릿과 함께 Azure CLI를 사용하여 Azure에 리소스를 배포하는 방법을 설명합니다.This article explains how to use Azure CLI with Azure Resource Manager (ARM) templates to deploy your resources to Azure. Azure 솔루션 배포 및 관리 개념에 익숙하지 않은 경우 템플릿 배포 개요를참조하세요.If you aren't familiar with the concepts of deploying and managing your Azure solutions, see template deployment overview.

Azure CLI 버전 2.2.0에서 배포 명령이 변경되었습니다.The deployment commands changed in Azure CLI version 2.2.0. 이 문서의 예제에서는 Azure CLI 버전 2.2.0 이상이 필요합니다.The examples in this article require Azure CLI version 2.2.0 or later.

이 샘플을 실행하려면 최신 버전의 Azure CLI를 설치합니다.To run this sample, install the latest version of the Azure CLI. 시작하려면 az login을 실행하여 Azure와 연결합니다.To start, run az login to create a connection with Azure.

Azure CLI 샘플은 bash 셸용으로 작성됩니다.Samples for the Azure CLI are written for the bash shell. Windows PowerShell 또는 명령 프롬프트에서 이 샘플을 실행하려면 스크립트의 요소를 변경해야 할 수도 있습니다.To run this sample in Windows PowerShell or Command Prompt, you may need to change elements of the script.

Azure CLI가 설치되어 있지 않으면 Cloud Shell을 사용할 수 있습니다.If you don't have Azure CLI installed, you can use the Cloud Shell.

배포 범위Deployment scope

배포를 리소스 그룹, 구독, 관리 그룹 또는 테넌트에 대상으로 지정할 수 있습니다.You can target your deployment to a resource group, subscription, management group, or tenant. 대부분의 경우 리소스 그룹에 대한 배포를 대상으로 합니다.In most cases, you'll target deployment to a resource group. 더 큰 범위에 정책 및 역할 할당을 적용하려면 구독, 관리 그룹 또는 테넌트 배포를 사용합니다.To apply policies and role assignments across a larger scope, use subscription, management group, or tenant deployments. 구독에 배포할 때 리소스 그룹을 만들고 구독에 리소스를 배포할 수 있습니다.When deploying to a subscription, you can create a resource group and deploy resources to it.

배포 범위에 따라 다른 명령을 사용합니다.Depending on the scope of the deployment, you use different commands.

리소스 그룹에배포하려면 az 배포 그룹 만들기를사용합니다.To deploy to a resource group, use az deployment group create:

az deployment group create --resource-group <resource-group-name> --template-file <path-to-template>

구독에배포하려면 az 배포 하위 만들기를 사용합니다.To deploy to a subscription, use az deployment sub create:

az deployment sub create --location <location> --template-file <path-to-template>

구독 수준 배포에 대한 자세한 내용은 구독 수준에서 리소스 그룹 및 리소스 만들기를참조하십시오.For more information about subscription level deployments, see Create resource groups and resources at the subscription level.

관리 그룹에배포하려면 az 배포 mg create를사용합니다.To deploy to a management group, use az deployment mg create:

az deployment mg create --location <location> --template-file <path-to-template>

관리 그룹 수준 배포에 대한 자세한 내용은 관리 그룹 수준에서 리소스 만들기를참조하십시오.For more information about management group level deployments, see Create resources at the management group level.

테넌트에배포하려면 az 배포 테넌트 만들기를사용합니다.To deploy to a tenant, use az deployment tenant create:

az deployment tenant create --location <location> --template-file <path-to-template>

테넌트 수준 배포에 대한 자세한 내용은 테넌트 수준에서 리소스 만들기를참조하십시오.For more information about tenant level deployments, see Create resources at the tenant level.

이 문서의 예제에서는 리소스 그룹 배포를 사용합니다.The examples in this article use resource group deployments.

로컬 템플릿 배포Deploy local template

Azure에 리소스를 배포할 때 다음을 수행합니다.When deploying resources to Azure, you:

  1. Azure 계정에 로그인Sign in to your Azure account
  2. 배포된 리소스에 대한 컨테이너 역할을 하는 리소스 그룹을 만듭니다.Create a resource group that serves as the container for the deployed resources. 리소스 그룹의 이름은 영숫자, 마침표, 밑줄, 하이픈 및 괄호만 포함할 수 있습니다.The name of the resource group can only include alphanumeric characters, periods, underscores, hyphens, and parenthesis. 최대 90자까지 가능합니다.It can be up to 90 characters. 마침표로 끝날 수 없습니다.It can't end in a period.
  3. 만들려는 리소스를 정의하는 템플릿을 리소스 그룹에 배포Deploy to the resource group the template that defines the resources to create

템플릿에는 템플릿 배포를 사용자 지정할 수 있도록 하는 매개 변수가 포함될 수 있습니다.A template can include parameters that enable you to customize the deployment. 예를 들어 특정 환경(예: 개발, 테스트 및 프로덕션)에 맞게 조정되는 값을 제공할 수 있습니다.For example, you can provide values that are tailored for a particular environment (such as dev, test, and production). 샘플 템플릿은 스토리지 계정 SKU에 대한 매개 변수를 정의합니다.The sample template defines a parameter for the storage account SKU.

다음 예제에서는 리소스 그룹을 만들고 로컬 컴퓨터에서 템플릿을 배포합니다.The following example creates a resource group, and deploys a template from your local machine:

az group create --name ExampleGroup --location "Central US"
az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-file storage.json \
  --parameters storageAccountType=Standard_GRS

배포가 완료될 때까지 몇 분 정도 걸릴 수 있습니다.The deployment can take a few minutes to complete. 완료되면 결과가 포함된 메시지가 표시됩니다.When it finishes, you see a message that includes the result:

"provisioningState": "Succeeded",

원격 템플릿 배포Deploy remote template

ARM 템플릿을 로컬 컴퓨터에 저장하는 대신 외부 위치에 저장하는 것이 좋습니다.Instead of storing ARM templates on your local machine, you may prefer to store them in an external location. 원본 제어 리포지토리(예: GitHub)에 템플릿을 저장할 수 있습니다.You can store templates in a source control repository (such as GitHub). 또는 조직에서 공유 액세스에 대한 Azure Storage 계정에 저장할 수 있습니다.Or, you can store them in an Azure storage account for shared access in your organization.

외부 템플릿을 배포하려면 template-uri 매개 변수를 사용합니다.To deploy an external template, use the template-uri parameter. 예제의 URI를 사용하여 GitHub에서 샘플 템플릿을 배포합니다.Use the URI in the example to deploy the sample template from GitHub.

az group create --name ExampleGroup --location "Central US"
az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json" \
  --parameters storageAccountType=Standard_GRS

앞의 예제에서는 템플릿에 중요한 데이터가 포함되어 있지 않으므로 대부분의 시나리오에 적합한 이 템플릿에 대해 공개적으로 액세스할 수 있는 URI가 필요합니다.The preceding example requires a publicly accessible URI for the template, which works for most scenarios because your template shouldn't include sensitive data. 중요한 데이터(예: 관리자 암호)를 지정해야 하는 경우 해당 값을 안전한 매개 변수로 전달합니다.If you need to specify sensitive data (like an admin password), pass that value as a secure parameter. 그러나 템플릿에 공개적으로 액세스할 수 있도록 하지 않으려면 프라이빗 스토리지 컨테이너에 저장하여 보호할 수 있습니다.However, if you don't want your template to be publicly accessible, you can protect it by storing it in a private storage container. SAS(공유 액세스 서명) 토큰이 필요한 템플릿을 배포하는 데 관한 내용은 SAS 토큰으로 프라이빗 템플릿 배포를 참조하세요.For information about deploying a template that requires a shared access signature (SAS) token, see Deploy private template with SAS token.

Cloud Shell에서 템플릿 배포Deploy template from Cloud Shell

Cloud Shell을 사용하여 템플릿을 배포할 수 있습니다.You can use Cloud Shell to deploy your template. 외부 템플릿을 배포하려면 모든 외부 배포에서와 정확히 동일한 형식으로 템플릿의 URI를 입력합니다.To deploy an external template, provide the URI of the template exactly as you would for any external deployment. 로컬 템플릿을 배포하려면 먼저 Cloud Shell용 스토리지 계정에 템플릿을 로드해야 합니다.To deploy a local template, you must first load your template into the storage account for your Cloud Shell. 이 섹션에서는 Cloud Shell 계정에 템플릿을 로드한 다음 로컬 파일로 배포하는 방법을 설명합니다.This section describes how to load the template to your cloud shell account, and deploy it as a local file. Cloud Shell을 사용해 본 적이 없다면 Azure Cloud Shell 개요에서 Cloud Shell 설정 방법을 참조하세요.If you haven't used Cloud Shell, see Overview of Azure Cloud Shell for information about setting it up.

  1. Azure 포털에로그인합니다.Sign in to the Azure portal.

  2. Cloud Shell 리소스 그룹을 선택합니다.Select your Cloud Shell resource group. 이름 패턴은 cloud-shell-storage-<region>입니다.The name pattern is cloud-shell-storage-<region>.

    리소스 그룹 선택

  3. Cloud Shell용 스토리지 계정을 선택합니다.Select the storage account for your Cloud Shell.

    스토리지 계정 선택

  4. Blob을 선택합니다.Select Blobs.

    Blob 선택

  5. +컨테이너를 선택합니다.Select + Container.

    컨테이너 추가

  6. 컨테이너에 이름과 액세스 수준을 지정합니다.Give your container a name and an access level. 이 문서의 샘플 템플릿에는 중요한 정보가 없으므로 익명 읽기 액세스를 허용합니다.The sample template in this article contains no sensitive information, so allow anonymous read access. 확인을 선택합니다.Select OK.

    컨테이너 값 제공

  7. 만든 컨테이너를 선택합니다.Select the container you created.

    새 컨테이너 선택

  8. 업로드를 선택합니다.Select Upload.

    Blob 업로드

  9. 템플릿을 찾아서 업로드합니다.Find and upload your template.

    파일 업로드

  10. 업로드된 후 템플릿을 선택합니다.After it has uploaded, select the template.

    새 템플릿 선택

  11. URL을 복사합니다.Copy the URL.

    URL 복사

  12. 프롬프트를 엽니다.Open the prompt.

    Cloud Shell 열기

Cloud Shell에서 다음 명령을 사용합니다.In the Cloud Shell, use the following commands:

az group create --name examplegroup --location "South Central US"
az deployment group create --resource-group examplegroup \
  --template-uri <copied URL> \
  --parameters storageAccountType=Standard_GRS

매개 변수Parameters

매개 변수 값을 전달하려면 인라인 매개 변수 또는 매개 변수 파일을 사용할 수 있습니다.To pass parameter values, you can use either inline parameters or a parameter file.

인라인 매개 변수입니다.Inline parameters

인라인 매개 변수를 전달하려면 parameters에 값을 제공합니다.To pass inline parameters, provide the values in parameters. 예를 들어 Bash 셸에서 문자열 및 배열을 템플릿에 전달하려면 다음을 사용합니다.For example, to pass a string and array to a template is a Bash shell, use:

az deployment group create \
  --resource-group testgroup \
  --template-file demotemplate.json \
  --parameters exampleString='inline string' exampleArray='("value1", "value2")'

CMD(Windows 명령 프롬프트) 또는 PowerShell을 사용하여 Azure CLI를 사용하는 exampleArray="['value1','value2']"경우 배열을 형식으로 전달합니다.If you're using Azure CLI with Windows Command Prompt (CMD) or PowerShell, pass the array in the format: exampleArray="['value1','value2']".

파일의 콘텐츠를 가져와서 해당 콘텐츠를 인라인 매개 변수로 제공할 수도 있습니다.You can also get the contents of file and provide that content as an inline parameter.

az deployment group create \
  --resource-group testgroup \
  --template-file demotemplate.json \
  --parameters exampleString=@stringContent.txt exampleArray=@arrayContent.json

파일에서 매개 변수 값을 가져오면 구성 값을 제공해야 하는 경우에 유용합니다.Getting a parameter value from a file is helpful when you need to provide configuration values. 예를 들어, Linux 가상 머신에 대한 Cloud-Init 값을 제공할 수 있습니다.For example, you can provide cloud-init values for a Linux virtual machine.

arrayContent.json 형식은 다음과 같습니다.The arrayContent.json format is:

[
    "value1",
    "value2"
]

매개 변수 파일Parameter files

매개 변수를 스크립트에 인라인 값으로 전달하는 것보다는, 매개 변수 값이 포함된 JSON 파일을 사용하는 것이 더 쉬울 수 있습니다.Rather than passing parameters as inline values in your script, you may find it easier to use a JSON file that contains the parameter values. 매개 변수 파일은 로컬 파일이어야 합니다.The parameter file must be a local file. 외부 매개 변수 파일은 Azure CLI에서 사용할 수 없습니다.External parameter files aren't supported with Azure CLI.

매개 변수 파일에 대한 자세한 내용은 리소스 관리자 매개 변수 파일 만들기를참조하십시오.For more information about the parameter file, see Create Resource Manager parameter file.

로컬 매개 변수 파일을 전달하려면 @을 사용하여 storage.parameters.json이라는 로컬 파일을 지정합니다.To pass a local parameter file, use @ to specify a local file named storage.parameters.json.

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-file storage.json \
  --parameters @storage.parameters.json

확장 JSON 형식 처리Handle extended JSON format

여러 줄 문자열 이나 주석이 있는 템플릿을 배포 --handle-extended-json-format 하려면 스위치를 사용 해야 합니다.To deploy a template with multi-line strings or comments, you must use the --handle-extended-json-format switch. 예를 들어:For example:

{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2018-10-01",
  "name": "[variables('vmName')]", // to customize name, change it in variables
  "location": "[
    parameters('location')
    ]", //defaults to resource group location
  /*
    storage account and network interface
    must be deployed first
  */
  "dependsOn": [
    "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
  ],

템플릿 배포 테스트Test a template deployment

실제로 리소스를 배포하지 않고 템플릿 및 매개 변수 값을 테스트하려면 az 배포 그룹 유효성 검사를사용합니다.To test your template and parameter values without actually deploying any resources, use az deployment group validate.

az deployment group validate \
  --resource-group ExampleGroup \
  --template-file storage.json \
  --parameters @storage.parameters.json

오류가 감지되지 않으면 이 명령은 테스트 배포에 대한 정보를 반환합니다.If no errors are detected, the command returns information about the test deployment. 특히 error 값은 null입니다.In particular, notice that the error value is null.

{
  "error": null,
  "properties": {
      ...

오류가 감지되면 명령은 오류 메시지를 반환합니다.If an error is detected, the command returns an error message. 예를 들어, 스토리지 계정 SKU에 대해 잘못된 값을 전달하면 다음 오류가 반환됩니다.For example, passing an incorrect value for the storage account SKU, returns the following error:

{
  "error": {
    "code": "InvalidTemplate",
    "details": null,
    "message": "Deployment template validation failed: 'The provided value 'badSKU' for the template parameter
      'storageAccountType' at line '13' and column '20' is not valid. The parameter value is not part of the allowed
      value(s): 'Standard_LRS,Standard_ZRS,Standard_GRS,Standard_RAGRS,Premium_LRS'.'.",
    "target": null
  },
  "properties": null
}

템플릿에 구문 오류가 있는 경우 명령은 템플릿을 구문 분석할 수 없다는 오류를 반환합니다.If your template has a syntax error, the command returns an error indicating it couldn't parse the template. 메시지는 줄 번호 및 구문 분석 오류의 위치를 나타냅니다.The message indicates the line number and position of the parsing error.

{
  "error": {
    "code": "InvalidTemplate",
    "details": null,
    "message": "Deployment template parse failed: 'After parsing a value an unexpected character was encountered:
      \". Path 'variables', line 31, position 3.'.",
    "target": null
  },
  "properties": null
}

다음 단계Next steps