Azure Container Apps ARM 및 YAML 템플릿 사양

Azure Container Apps 배포는 ARM(Azure Resource Manager) 템플릿을 통해 구동됩니다. 또한 일부 Container Apps CLI 명령은 YAML 템플릿을 사용하여 리소스를 지정하는 것도 지원합니다.

이 문서에서는 자주 사용되는 Container Apps 리소스에 대한 ARM 및 YAML 구성에 대해 설명합니다. Container Apps 리소스의 전체 목록은 Container Apps용 Azure Resource Manager 템플릿을 참조 하세요.

API 버전

Azure Container Apps의 최신 관리 API 버전은 다음과 같습니다.

API 버전 간의 차이점에 대한 자세한 내용은 Microsoft.App 변경 로그를 참조 하세요.

API 버전 업데이트

ARM 또는 Bicep에서 특정 API 버전을 사용하려면 템플릿에서 참조되는 버전을 업데이트합니다. Azure CLI 또는 Azure PowerShell에서 최신 API 버전을 사용하려면 최신 버전으로 업데이트합니다.

다음 명령을 실행하여 Azure CLI 및 Azure Container Apps 확장을 업데이트합니다.

az upgrade
az extension add -n containerapp --upgrade

Azure PowerShell을 업데이트하려면 Azure PowerShell을 설치하는 방법을 참조하세요.

최신 API 버전으로 Azure Container Apps를 프로그래밍 방식으로 관리하려면 최신 버전의 관리 SDK를 사용합니다.

Container Apps 환경

다음 표에서는 Container Apps 환경 리소스에서 사용할 수 있는 일반적으로 사용되는 속성에 대해 설명합니다. 속성의 전체 목록은 Azure Container Apps REST API 참조를 참조 하세요.

리소스

Container Apps 환경 리소스에는 다음 속성이 포함됩니다.

속성 설명 데이터 형식 읽기 전용
daprAIInstrumentationKey Darp에 의해 사용된 Application Insights 계측 키. string 아니요
appLogsConfiguration 환경의 로깅 구성. Object 아니요
peerAuthentication mTLS 암호화를 사용하도록 설정하는 방법 Object 아니요

예제

다음 예제 ARM 템플릿 코드 조각은 Container Apps 환경을 배포합니다.

참고 항목

컨테이너 앱 환경을 만드는 명령은 YAML 구성 입력을 지원하지 않습니다.

{
  "location": "East US",
  "properties": {
    "daprAIConnectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://northcentralus-0.in.applicationinsights.azure.com/",
    "appLogsConfiguration": {
      "logAnalyticsConfiguration": {
        "customerId": "string",
        "sharedKey": "string"
      }
    },
    "zoneRedundant": true,
    "vnetConfiguration": {
      "infrastructureSubnetId": "/subscriptions/<subscription_id>/resourceGroups/RGName/providers/Microsoft.Network/virtualNetworks/VNetName/subnets/subnetName1"
    },
    "customDomainConfiguration": {
      "dnsSuffix": "www.my-name.com",
      "certificateValue": "Y2VydA==",
      "certificatePassword": "1234"
    },
    "workloadProfiles": [
      {
        "name": "My-GP-01",
        "workloadProfileType": "GeneralPurpose",
        "minimumCount": 3,
        "maximumCount": 12
      },
      {
        "name": "My-MO-01",
        "workloadProfileType": "MemoryOptimized",
        "minimumCount": 3,
        "maximumCount": 6
      },
      {
        "name": "My-CO-01",
        "workloadProfileType": "ComputeOptimized",
        "minimumCount": 3,
        "maximumCount": 6
      },
      {
        "name": "My-consumption-01",
        "workloadProfileType": "Consumption"
      }
    ],
    "infrastructureResourceGroup": "myInfrastructureRgName"
  }
}

컨테이너 앱

다음 표에서는 컨테이너 앱 리소스에서 일반적으로 사용되는 속성에 대해 설명합니다. 속성의 전체 목록은 Azure Container Apps REST API 참조를 참조 하세요.

리소스

컨테이너 앱 리소스의 properties 개체에는 다음 속성이 포함됩니다.

속성 설명 데이터 형식 읽기 전용
provisioningState 새 컨테이너 수정 버전이 만들어지는 경우와 같은 장기 실행 작업의 상태입니다. 가능한 값은 프로비저닝 중, 프로비저닝됨, 실패입니다. 앱이 실행 중인지 확인합니다. string
environmentId 컨테이너 앱의 환경 ID입니다. 컨테이너 앱을 만드는 데 필요한 속성입니다. YAML을 사용하는 경우 대신 Azure CLI의 --environment 옵션을 사용하여 환경 ID를 지정할 수 있습니다. string 아니요
latestRevisionName 최신 수정 버전의 이름입니다. string
latestRevisionFqdn 최신 수정 버전의 URL입니다. string

environmentId 값은 다음 형식을 사용합니다.

/subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/environmentId/<ENVIRONMENT_NAME>

이 예제에서는 <> 대괄호로 둘러싸인 자리 표시자 토큰 대신 값을 배치합니다.

properties.configuration

리소스의 properties.configuration 개체에는 다음 속성이 포함됩니다.

속성 설명 데이터 형식
activeRevisionsMode single로 설정하면 이전 수정 버전을 자동으로 비활성화하고 최신 수정 버전만 활성 상태로 유지됩니다. multiple로 설정하면 여러 수정 버전을 유지할 수 있습니다. string
secrets 컨테이너 앱에서 비밀 값을 정의합니다. 개체
ingress 컨테이너 앱의 퍼블릭 접근성 액세스를 정의하는 개체입니다. 개체
registries 프라이빗 컨테이너 레지스트리에 대한 자격 증명을 참조하는 구성 개체입니다. secretref로 정의된 항목은 비밀 구성 개체를 참조합니다. 개체
dapr 컨테이너 앱에 대한 Dapr 설정을 정의하는 구성 개체입니다. 개체

configuration 섹션에 대한 변경 내용은 새 수정 버전을 트리거하지 않는 애플리케이션 범위 변경입니다.

properties.template

리소스의 properties.template 개체에는 다음 속성이 포함됩니다.

속성 설명 데이터 형식
revisionSuffix 수정 버전에 대한 식별 이름입니다. 런타임은 기존 수정 버전 이름 접미사 값과의 모든 충돌을 거부하므로 이 값은 고유해야 합니다. string
containers 컨테이너 앱에 포함된 컨테이너 이미지를 정의하는 구성 개체입니다. 개체
scale 컨테이너 앱에 대한 스케일링 규칙을 정의하는 구성 개체입니다. 개체

template섹션에 대한 변경 내용은 새 수정을 트리거하는 수정 버전-범위 변경입니다.

예제

상태 프로브에 대한 자세한 내용은 Azure Container Apps의 상태 프로브를 참조 하세요.

다음 예제 ARM 템플릿 코드 조각은 컨테이너 앱을 배포합니다.

{
  "identity": {
    "userAssignedIdentities": {
      "/subscriptions/<subscription_id>/resourcegroups/my-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-user": {
      }
    },
    "type": "UserAssigned"
  },
  "properties": {
    "environmentId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/managedEnvironments/demokube",
    "workloadProfileName": "My-GP-01",
    "configuration": {
      "ingress": {
        "external": true,
        "targetPort": 3000,
        "customDomains": [
          {
            "name": "www.my-name.com",
            "bindingType": "SniEnabled",
            "certificateId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/managedEnvironments/demokube/certificates/my-certificate-for-my-name-dot-com"
          },
          {
            "name": "www.my-other-name.com",
            "bindingType": "SniEnabled",
            "certificateId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/managedEnvironments/demokube/certificates/my-certificate-for-my-other-name-dot-com"
          }
        ],
        "traffic": [
          {
            "weight": 100,
            "revisionName": "testcontainerApp0-ab1234",
            "label": "production"
          }
        ],
        "ipSecurityRestrictions": [
          {
            "name": "Allow work IP A subnet",
            "description": "Allowing all IP's within the subnet below to access containerapp",
            "ipAddressRange": "192.168.1.1/32",
            "action": "Allow"
          },
          {
            "name": "Allow work IP B subnet",
            "description": "Allowing all IP's within the subnet below to access containerapp",
            "ipAddressRange": "192.168.1.1/8",
            "action": "Allow"
          }
        ],
        "stickySessions": {
          "affinity": "sticky"
        },
        "clientCertificateMode": "accept",
        "corsPolicy": {
          "allowedOrigins": [
            "https://a.test.com",
            "https://b.test.com"
          ],
          "allowedMethods": [
            "GET",
            "POST"
          ],
          "allowedHeaders": [
            "HEADER1",
            "HEADER2"
          ],
          "exposeHeaders": [
            "HEADER3",
            "HEADER4"
          ],
          "maxAge": 1234,
          "allowCredentials": true
        }
      },
      "dapr": {
        "enabled": true,
        "appPort": 3000,
        "appProtocol": "http",
        "httpReadBufferSize": 30,
        "httpMaxRequestSize": 10,
        "logLevel": "debug",
        "enableApiLogging": true
      },
      "maxInactiveRevisions": 10,
      "service": {
        "type": "redis"
      }
    },
    "template": {
      "containers": [
        {
          "image": "repo/testcontainerApp0:v1",
          "name": "testcontainerApp0",
          "probes": [
            {
              "type": "Liveness",
              "httpGet": {
                "path": "/health",
                "port": 8080,
                "httpHeaders": [
                  {
                    "name": "Custom-Header",
                    "value": "Awesome"
                  }
                ]
              },
              "initialDelaySeconds": 3,
              "periodSeconds": 3
            }
          ],
          "volumeMounts": [
            {
              "mountPath": "/myempty",
              "volumeName": "myempty"
            },
            {
              "mountPath": "/myfiles",
              "volumeName": "azure-files-volume"
            },
            {
              "mountPath": "/mysecrets",
              "volumeName": "mysecrets"
            }
              ]
        }
      ],
      "initContainers": [
        {
          "image": "repo/testcontainerApp0:v4",
          "name": "testinitcontainerApp0",
          "resources": {
            "cpu": 0.2,
            "memory": "100Mi"
          },
          "command": [
            "/bin/sh"
          ],
          "args": [
            "-c",
            "while true; do echo hello; sleep 10;done"
          ]
        }
      ],
      "scale": {
        "minReplicas": 1,
        "maxReplicas": 5,
        "rules": [
          {
            "name": "httpscalingrule",
            "custom": {
              "type": "http",
              "metadata": {
                "concurrentRequests": "50"
              }
            }
          }
        ]
      },
      "volumes": [
        {
          "name": "myempty",
          "storageType": "EmptyDir"
        },
        {
          "name": "azure-files-volume",
          "storageType": "AzureFile",
          "storageName": "myazurefiles"
        },
        {
          "name": "mysecrets",
          "storageType": "Secret",
          "secrets": [
            {
              "secretRef": "mysecret",
              "path": "mysecret.txt"
            }
          ]
        }
      ],
      "serviceBinds": [
        {
          "serviceId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/containerApps/redisService",
          "name": "redisService"
        }
      ]
    }
  }
}

Container Apps 작업

다음 표에서는 Container Apps 작업 리소스에서 일반적으로 사용되는 속성에 대해 설명합니다. 속성의 전체 목록은 Azure Container Apps REST API 참조를 참조 하세요.

리소스

Container Apps 작업 리소스의 properties 개체에는 다음 속성이 포함됩니다.

속성 설명 데이터 형식 읽기 전용
environmentId Container Apps 작업의 환경 ID입니다. 이 속성은 Container Apps 작업을 만드는 데 필요합니다. YAML을 사용하는 경우 대신 Azure CLI의 --environment 옵션을 사용하여 환경 ID를 지정할 수 있습니다. string 아니요

environmentId 값은 다음 형식을 사용합니다.

/subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/environmentId/<ENVIRONMENT_NAME>

이 예제에서는 <> 대괄호로 둘러싸인 자리 표시자 토큰 대신 값을 배치합니다.

properties.configuration

리소스의 properties.configuration 개체에는 다음 속성이 포함됩니다.

속성 설명 데이터 형식
triggerType Container Apps 작업에 대한 트리거 유형입니다. 각 트리거 유형에 대한 특정 구성은 작업 트리거 유형을 참조 하세요. string
replicaTimeout Container Apps 작업에 대한 시간 제한(초)입니다. 정수
replicaRetryLimit Container Apps 작업을 다시 시도할 횟수입니다. 정수

properties.template

리소스의 properties.template 개체에는 다음 속성이 포함됩니다.

속성 설명 데이터 형식
containers 작업에 포함되는 컨테이너 이미지를 정의하는 구성 개체입니다. 개체
scale 작업에 대한 크기 조정 규칙을 정의하는 구성 개체입니다. 개체

예제

다음 예제 ARM 템플릿 코드 조각은 Container Apps 작업을 배포합니다.

{
  "identity": {
    "userAssignedIdentities": {
      "/subscriptions/<subscription_id>/resourcegroups/my-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-user": {
      }
    },
    "type": "UserAssigned"
  },
  "properties": {
    "environmentId": "/subscriptions/<subscription_id>/resourceGroups/rg/providers/Microsoft.App/managedEnvironments/demokube",
    "configuration": {
      "replicaTimeout": 10,
      "replicaRetryLimit": 10,
      "manualTriggerConfig": {
        "replicaCompletionCount": 1,
        "parallelism": 4
      },
      "triggerType": "Manual"
    },
    "template": {
      "containers": [
        {
          "image": "repo/testcontainerAppsJob0:v1",
          "name": "testcontainerAppsJob0",
          "probes": [
            {
              "type": "Liveness",
              "httpGet": {
                "path": "/health",
                "port": 8080,
                "httpHeaders": [
                  {
                    "name": "Custom-Header",
                    "value": "Awesome"
                  }
                ]
              },
              "initialDelaySeconds": 5,
              "periodSeconds": 3
            }
          ],
          "volumeMounts": [
            {
              "mountPath": "/myempty",
              "volumeName": "myempty"
            },
            {
              "mountPath": "/myfiles",
              "volumeName": "azure-files-volume"
            },
            {
              "mountPath": "/mysecrets",
              "volumeName": "mysecrets"
            }
          ]
        }
      ],
      "initContainers": [
        {
          "image": "repo/testcontainerAppsJob0:v4",
          "name": "testinitcontainerAppsJob0",
          "resources": {
            "cpu": 0.2,
            "memory": "100Mi"
          },
          "command": [
            "/bin/sh"
          ],
          "args": [
            "-c",
            "while true; do echo hello; sleep 10;done"
          ]
        }
      ],
      "volumes": [
        {
          "name": "myempty",
          "storageType": "EmptyDir"
        },
        {
          "name": "azure-files-volume",
          "storageType": "AzureFile",
          "storageName": "myazurefiles"
        },
        {
          "name": "mysecrets",
          "storageType": "Secret",
          "secrets": [
            {
              "secretRef": "mysecret",
              "path": "mysecret.txt"
            }
          ]
        }
      ]
    }
  }
}