Azure CLI를 성공적으로 사용하기 위한 팁

Azure CLI는 여러 셸 환경에서 Azure 리소스를 구성하고 관리할 수 있는 명령줄 도구입니다. 선호하는 셸 환경을선택하고 Azure CLI를 설치한 후 이 문서를 사용하여 일반적인 문제를 방지하고 Azure CLI를 성공적으로 사용하는 방법에 대한 유용한 팁을 검색합니다.

특정 Azure CLI 명령에 대한 자세한 내용은 Azure CLI 참조 목록을 참조하세요.

출력 형식

Azure CLI 명령에는 세 가지 일반적인 출력 형식이 사용됩니다.

  1. json 형식은 정보를 JSON 문자열로 표시합니다.

    • JSON은 가장 포괄적인 정보를 제공합니다.
    • 이 형식은 기본값이지만 --output 매개 변수를 사용하여 다른 옵션을 지정할 수 있습니다.
    • 와 같은 az config set core.output=tableaz config를 사용하여 전역 기본 형식을 개인 기본 설정 중 하나로 변경합니다.
    • JSON 형식은 큰따옴표를 유지하므로 일반적으로 스크립팅에 적합하지 않습니다.
  2. table 형식은 출력을 읽을 수 있는 테이블로 표시합니다. 테이블에 표시할 값을 지정하고 쿼리를 사용하여 다음과 같이 출력을 사용자 지정할 수 있습니다.

    # command
    az vm show --resource-group myResourceGroup --name myVMname --query "{name: name, os:storageProfile.imageReference.offer}" --output table
    
    # output
    Name    Os
    ------  ------------
    myVMname   UbuntuServer
    
  3. tsv 형식은 추가 서식 지정, 키 또는 다른 기호 없이 탭으로 분리되고 줄 바꿈으로 구분된 값을 반환합니다.

    • TSV 형식은 간결한 출력 및 스크립팅 용도에 유용합니다.
    • TSV는 JSON 형식이 유지하는 큰따옴표를 제거합니다.
    • TSV에 대해 원하는 형식을 지정하려면 --query 매개 변수를 사용합니다.
    export vm_ids=$(az vm list --show-details --resource-group myResourceGroup --query "[?powerState=='VM running'].id" --output tsv)
    az vm stop --ids $vm_ids
    

이러한 형식 및 기타 형식에 대한 자세한 내용은 Azure CLI 명령의 출력 형식을 참조하세요.

다른 명령에 값 전달

값이 두 번 이상 사용되는 경우 변수에 할당합니다. 변수를 사용하면 값을 여러 번 사용하거나 보다 일반적인 스크립트를 만들 수 있습니다. 다음은 az vm list 명령에서 찾은 ID를 변수에 할당하는 예제입니다.

# assign the list of running VMs to a variable
running_vm_ids=$(az vm list --resource-group MyResourceGroup --show-details \
    --query "[?powerState=='VM running'].id" --output tsv)

# verify the value of the variable
echo $running_vm_ids

값이 한 번만 사용되는 경우 파이핑을 사용하는 것이 좋습니다. (파이핑은 한 명령의 출력을 두 번째 명령에 대한 입력으로 전달합니다.)

az vm list --query "[?powerState=='VM running'].name" --output tsv | grep my_vm

다중 값 목록의 경우 다음 옵션을 고려합니다.

  1. 결과에 대한 추가 제어가 필요한 경우 "for" 루프를 사용합니다.

    #!/usr/bin/env bash
    for vmList in $(az vm list --resource-group MyResourceGroup --show-details --query "[?powerState=='VM running'].id"   --output tsv); do
        echo stopping $vmList
        az vm stop --ids $vmList
        if [ $? -ne 0 ]; then
            echo "Failed to stop $vmList"
            exit 1
        fi
        echo $vmList stopped
    done
    
  2. 또는 성능을 향상시키기 위해 xargs를 사용하고, -P 플래그를 사용하여 작업을 병렬로 실행하는 것이 좋습니다.

    az vm list --resource-group MyResourceGroup --show-details \
      --query "[?powerState=='VM stopped'].id" \
      --output tsv | xargs -I {} -P 10 az vm start --ids "{}"
    
  3. 마지막으로, Azure CLI는 xargs의 동일한 효과를 얻기 위해 여러 --ids 명령을 병렬로 처리하는 기본 제공 지원을 제공합니다. @- 는 파이프에서 값을 가져오는 데 사용됩니다.

    az vm list --resource-group MyResourceGroup --show-details \
      --query "[?powerState=='VM stopped'].id" \
      --output tsv | az vm start --ids @-
    

루프, 사례 문, if..then..else 및 오류 처리를 포함하여 Azure CLI에서 Bash 구문을 사용하는 방법에 대한 자세한 내용은 Azure CLI에서 Bash를 사용하는 방법 알아보기를 참조하세요.

매개 변수에 따옴표 사용

Azure CLI 명령을 사용하는 경우 셸에서 따옴표를 사용하고 문자를 이스케이프하는 방법을 알고 있어야 합니다. 다른 셸에서 사용되는 스크립트를 지원하는 경우 차이점을 이해합니다.

참고 항목

알려진 PowerShell 문제로 인해 몇 가지 추가 이스케이프 규칙이 적용됩니다. 자세한 내용은 PowerShell의 따옴표 넣기 문제를 참조하세요.

예기치 않은 결과를 방지하기 위해 다음과 같은 몇 가지 제안이 있습니다.

  • 공백이 포함된 매개 변수를 제공하는 경우 따옴표로 묶습니다.

  • Bash 또는 PowerShell에서는 작은따옴표와 큰따옴표가 모두 올바르게 해석됩니다. Windows 명령 프롬프트에서는 큰따옴표만 올바르게 해석됩니다. 작은따옴표는 값의 일부로 처리됩니다.

  • 명령이 Bash(또는 Zsh)에서만 실행되도록 하려면 작은따옴표를 사용하여 JSON 문자열 내의 콘텐츠를 유지합니다. 인라인 JSON 값을 제공할 때는 작은따옴표가 필요합니다. 예를 들어 이 JSON은 Bash에서 '{"key": "value"}'올바릅니다.

  • 명령이 Windows 명령 프롬프트에서 실행되는 경우 큰따옴표를 사용해야 합니다. 값에 큰따옴표가 포함되어 있으면 이를 이스케이프해야 합니다. 위의 JSON 문자열에 해당하는 것은 "{\"key\": \"value\"}"입니다.

  • PowerShell에서 값이 빈 문자열 '""'인 경우 .

  • Bash 또는 PowerShell에서 값이 빈 따옴표 문자열''"''"인 경우 .

  • Azure CLI의 @<file> 규칙을 사용하여 파일에서 로드하고 셸의 해석 메커니즘을 바이패스합니다.

    az ad app create --display-name myName --native-app --required-resource-accesses @manifest.json
    
  • Bash는 내보낸 변수에서 큰따옴표를 계산합니다. 이 동작이 원하는 동작이 아니면 변수 "\$variable"를 이스케이프합니다.

  • 일부 Azure CLI 명령은 공백으로 구분된 값의 목록을 가져옵니다.

    • 키 이름 또는 값에 공백이 포함된 경우 전체 쌍 "my key=my value"을 래핑합니다. 예시:

      az web app config app settings set --resource-group myResourceGroup --name myWebAppName --settings "client id=id1" "my name=john"
      
    • CLI 매개 변수가 공백으로 구분된 목록을 허용한다고 명시하는 경우 다음 두 가지 형식 중 하나가 필요합니다.

      1. 따옴표를 사용하지 않고 공백으로 구분된 목록 --parameterName firstValue secondValue
      2. 따옴표를 사용하고 공백으로 구분된 목록 --parameterName "firstValue" "secondValue"

      이 예제는 공백이 있는 문자열입니다. 공백으로 구분된 목록이 아닙니다. --parameterName "firstValue secondValue"

  • @와 같은 PowerShell의 특수 문자가 있습니다. PowerShell에서 Azure CLI를 실행하려면 특수 문자 앞에 `를 추가하여 이스케이프합니다. 값을 작은따옴표 또는 큰따옴표 "/"로 묶을 수도 있습니다.

    # The following three examples will work in PowerShell
    --parameterName `@parameters.json
    --parameterName '@parameters.json'
    --parameterName "@parameters.json"
    
    # This example will not work in PowerShell
    --parameterName @parameters.json
    
  • 명령과 함께 매개 변수를 --query 사용하는 경우 JMESPath일부 문자를 셸에서 이스케이프해야 합니다.

    다음 세 가지 명령은 Bash에서도 정확하고 동일합니다.

    az version --query '"azure-cli"'
    az version --query \"azure-cli\"
    az version --query "\"azure-cli\""
    

    다음은 Bash에서 잘못된 명령의 두 가지 예입니다.

    # Wrong, as the dash needs to be quoted in a JMESPath query
    az version --query azure-cli
    az version: error: argument --query: invalid jmespath_type value: 'azure-cli'
    
    # Wrong, as the dash needs to be quoted in a JMESPath query, but quotes are interpreted by Bash
    az version --query "azure-cli"
    az version: error: argument --query: invalid jmespath_type value: 'azure-cli'
    

    Bash, PowerShell 및 Cmd 간의 더 많은 예제 비교는 Azure CLI 명령 출력 쿼리를 참조하세요.


  • 따옴표 넣기 문제를 해결하는 가장 좋은 방법은 --debug 플래그를 사용하여 명령을 실행하는 것입니다. 이 플래그는 Python 구문에서 Azure CLI가 받은 실제 인수를 나타냅니다.

    # Correct
    $ az '{"key":"value"}' --debug
    Command arguments: ['{"key":"value"}', '--debug']
    
    # Correct
    $ az "{\"key\":\"value\"}" --debug
    Command arguments: ['{"key":"value"}', '--debug']
    
    # Wrong, as quotes and spaces are interpreted by Bash
    $ az {"key": "value"} --debug
    Command arguments: ['{key:', 'value}', '--debug']
    
    # Wrong, as quotes are interpreted by Bash
    $ az {"key":"value"} --debug
    Command arguments: ['{key:value}', '--debug']
    

매개 변수에 하이픈 문자 사용

매개 변수의 값이 하이픈으로 시작하는 경우 Azure CLI는 해당 값을 매개 변수 이름으로 구문 분석하려 합니다. 값으로 구문 분석하려면 =를 사용하여 매개 변수 이름과 값(--password="-VerySecret")을 연결합니다.

비동기 작업

Azure에서 작업을 수행하려면 상당한 시간이 걸릴 수 있습니다. 예를 들어, 데이터 센터에서 가상 머신을 구성하는 것은 즉시 이루어지지 않습니다. Azure CLI는 명령이 완료되어 다른 명령을 수락할 때까지 기다립니다. 따라서 많은 명령은 다음과 같은 --no-wait 매개 변수를 제공합니다.

az group delete --name MyResourceGroup --no-wait

리소스 그룹을 삭제하면 해당 그룹에 속한 모든 리소스도 제거됩니다. 이러한 리소스를 제거하는 데 시간이 오래 걸릴 수 있습니다. 매개 변수를 사용하여 명령을 --no-wait 실행하면 콘솔에서 제거를 중단하지 않고 새 명령을 수락합니다.

많은 명령이 대기 옵션을 제공하여 일부 조건이 충족될 때까지 콘솔을 일시 중지합니다. 다음 예제는 az vm wait 명령을 사용하여 독립 리소스를 병렬로 생성할 수 있도록 지원합니다.

az vm create --resource-group VMResources --name virtual-machine-01 --image centos --no-wait
az vm create --resource-group VMResources --name virtual-machine-02 --image centos --no-wait

subscription=$(az account show --query "id" -o tsv)
vm1_id="/subscriptions/$subscription/resourceGroups/VMResources/providers/Microsoft.Compute/virtualMachines/virtual-machine-01"
vm2_id="/subscriptions/$subscription/resourceGroups/VMResources/providers/Microsoft.Compute/virtualMachines/virtual-machine-02"
az vm wait --created --ids $vm1_id $vm2_id

두 ID를 모두 만든 후 콘솔을 다시 사용할 수 있습니다.

프록시 뒤에서 작업

자체 서명된 인증서를 사용하는 프록시 서버를 통해 Azure CLI를 사용하는 경우 Azure CLI에서 사용하는 Python 요청 라이브러리로 인해 SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",) 오류가 발생할 수 있습니다. 이 오류를 해결하려면 환경 변수 REQUESTS_CA_BUNDLE을 PEM 형식의 CA 번들 인증서 파일 경로로 설정합니다.

OS 기본 인증 기관 번들
Windows 32비트 C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem
Windows 64비트 C:\Program Files\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem
Ubuntu/Debian Linux /opt/az/lib/python<version>/site-packages/certifi/cacert.pem
CentOS/RHEL/SUSE Linux /usr/lib64/az/lib/python<version>/site-packages/certifi/cacert.pem
macOS /usr/local/Cellar/azure-cli/<cliversion>/libexec/lib/python<version>/site-packages/certifi/cacert.pem

프록시 서버의 인증서를 CA 번들 인증서 파일에 추가하거나 콘텐츠를 다른 인증서 파일에 복사합니다. 그런 다음, REQUESTS_CA_BUNDLE을 새 파일 위치로 설정합니다. 예를 들면 다음과 같습니다.

<Original cacert.pem>

-----BEGIN CERTIFICATE-----
<Your proxy's certificate here>
-----END CERTIFICATE-----

일부 프록시에는 인증이 필요합니다. HTTP_PROXY 또는 HTTPS_PROXY 환경 변수의 형식은 HTTPS_PROXY="https://username:password@proxy-server:port"와 같은 인증을 포함해야 합니다. 자세한 내용은 Azure 라이브러리에 대한 프록시를 구성하는 방법을 참조하세요.

동시 실행

동일한 컴퓨터에서 동시에 Azure CLI 명령을 실행하는 경우 여러 Azure CLI 명령이 동일한 MSAL 토큰 캐시에 쓰는 경우 쓰기 충돌이 발생할 수 있습니다.

잠재적인 오류를 방지하기 위해 각 스크립트에 대한 환경 변수 AZURE_CONFIG_DIR 를 별도의 디렉터리로 설정하여 각 스크립트에 대한 Azure CLI 구성 폴더를 격리할 수 있습니다. 해당 스크립트의 Azure CLI 명령은 구성 및 토큰 캐시를 기본 ~/.azure 폴더 대신 구성된 위치에 저장합니다.

export AZURE_CONFIG_DIR=/my/config/dir

일반 업데이트 매개 변수

Azure CLI 명령 그룹은 update 명령을 종종 사용합니다. 예를 들어, Azure Virtual Machines에는 az vm update 명령이 포함됩니다. 대부분의 업데이트 명령은 세 가지 제네릭 매개 변수를 --add--set--remove제공합니다.

--set--add 매개 변수는 공백으로 구분된 키-값 쌍 목록(key1=value1 key2=value2)을 사용합니다. 업데이트할 수 있는 속성을 확인하려면 az vm show와 같은 show 명령을 사용합니다.

az vm show --resource-group VMResources --name virtual-machine-01

명령을 간소화하려면 JSON 문자열을 사용하는 것이 좋습니다. 예를 들어 새 데이터 디스크를 가상 머신에 연결하려면 다음 값을 사용합니다.

az vm update --resource-group VMResources --name virtual-machine-01 \
--add storageProfile.dataDisks "{\"createOption\": \"Attach\", \"managedDisk\":
   {\"id\":
   \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/yg/providers/Microsoft.Compute/disks/yg-disk\"},
   \"lun\": 1}"

일반 리소스 명령(az resource)

작업하려는 서비스에 Azure CLI가 지원되지 않을 수 있습니다. az resource 명령을 사용하여 이러한 리소스로 작업할 수 있습니다.

만들기 또는 업데이트 명령만 필요한 경우 az deployment group create사용합니다. 작업 예제는 Azure 빠른 시작 템플릿을 참조 하세요.

REST API 명령(az rest)

일반 update 매개 변수와 az resource가 요구 사항을 충족하지 않는 경우 az rest 명령을 사용하여 REST API를 호출할 수 있습니다. 이 명령은 로그인한 자격 증명을 사용하여 자동으로 인증하고 헤더 Content-Type: application/json를 설정합니다. 자세한 내용은 Azure REST API 참조를 참조하세요.

이 예제는 Microsoft Graph API에서 작동합니다. 애플리케이션에 대한 리디렉션 URI를 업데이트하려면 다음 코드와 같이 애플리케이션 업데이트 REST API를 호출합니다.

# Get the application
az rest --method GET \
    --uri 'https://graph.microsoft.com/v1.0/applications/b4e4d2ab-e2cb-45d5-a31a-98eb3f364001'

# Update `redirectUris` for `web` property
az rest --method PATCH \
    --uri 'https://graph.microsoft.com/v1.0/applications/b4e4d2ab-e2cb-45d5-a31a-98eb3f364001' \
    --body '{"web":{"redirectUris":["https://myapp.com"]}}'

OData 형식의 요청에 사용할 --uri-parameters 경우 다른 환경에서 이스케 $ 이프해야 합니다. in , $ escape Bashas \$ 및 in PowerShell, escape $ as `$

스크립트 예제

다음은 Azure Virtual Machines로 작업할 때 변수를 사용하고 목록을 반복하는 예제입니다. 루프, 사례 문, if..then..else 및 오류 처리를 포함하여 Azure CLI에서 Bash 구문을 사용하는 방법에 대한 자세한 예제는 Azure CLI에서 Bash를 사용하는 방법 알아보기를 참조하세요.

다음 스크립트를 사용하여 변수에 ID를 저장합니다.

ECHO OFF
SETLOCAL
FOR /F "tokens=* USEBACKQ" %%F IN (
   `az vm list --resource-group VMResources --show-details --query "[?powerState=='VM running'].id" --output tsv`
) DO (
    SET "vm_ids=%%F %vm_ids%"  :: construct the id list
)
az vm stop --ids %vm_ids% :: CLI stops all VMs in parallel

다음 스크립트를 사용하여 목록을 반복합니다.

ECHO OFF
SETLOCAL
FOR /F "tokens=* USEBACKQ" %%F IN (
    `az vm list --resource-group VMResources --show-details --query "[?powerState=='VM running'].id" --output tsv`
) DO (
    ECHO Stopping %%F
    az vm stop --ids %%F
)

참고 항목