Especificações de modelo ARM e YAML dos Aplicativos de Contêiner do Azure

As implantações dos Aplicativos de Contêiner do Azure são desenvolvidas por um modelo do ARM (Azure Resource Manager). Alguns comandos da CLI de Aplicativos de Contêiner também dão suporte ao uso de um modelo YAML para especificar um recurso.

Este artigo descreve as configurações de ARM e YAML para recursos de aplicativos de contêiner usados com frequência. Para obter uma lista completa dos recursos de Aplicativos de Contêiner, consulte Modelos do Gerenciador de Recursos do Azure para Aplicativos de Contêiner.

Versões de API

As versões mais recentes da API de gerenciamento para Aplicativos de Contêiner do Azure são:

Para saber mais sobre as diferenças entre as versões da API, consulte Microsoft.App log de alterações.

Atualizando versões da API

Para usar uma versão específica da API no ARM ou no Bicep, atualize a versão referenciada em seus modelos. Para usar a versão mais recente da API na CLI do Azure ou no Azure PowerShell, atualize-a para a versão mais recente.

Atualize a CLI do Azure e a extensão Aplicativos de Contêiner do Azure executando os seguintes comandos:

az upgrade
az extension add -n containerapp --upgrade

Para atualizar o Azure PowerShell, consulte Como instalar o Azure PowerShell.

Para gerenciar programaticamente os Aplicativos de Contêiner do Azure com a versão mais recente da API, use as versões mais recentes do SDK de gerenciamento:

Ambiente de Aplicativos de Contêiner

As tabelas a seguir descrevem as propriedades comumente usadas disponíveis no recurso de ambiente Aplicativos de Contêiner. Para obter uma lista completa de propriedades, consulte Referência da API REST dos Aplicativos de Contêiner do Azure.

Recurso

Um recurso de ambiente de Aplicativos de Contêiner inclui as seguintes propriedades:

Propriedade Descrição Tipo de dados Somente leitura
daprAIInstrumentationKey A chave de instrumentação do Application Insights usada pelo Dapr. string Não
appLogsConfiguration A configuração de registro em log do ambiente. Objeto Não
peerAuthentication Como habilitar a criptografia mTLS. Objeto Não

Exemplos

O trecho de modelo ARM de exemplo a seguir implanta um ambiente de Aplicativos de Contêiner.

Observação

Os comandos para criar ambientes de aplicativo de contêiner não dão suporte à entrada de configuração 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"
  }
}

Aplicativo de contêiner

As tabelas a seguir descrevem as propriedades comumente usadas no recurso de aplicativo de contêiner. Para obter uma lista completa de propriedades, consulte Referência da API REST dos Aplicativos de Contêiner do Azure.

Recurso

O objeto de um recurso de aplicativo de properties contêiner inclui as seguintes propriedades:

Propriedade Descrição Tipo de dados Somente leitura
provisioningState O estado de uma operação de execução prolongada, por exemplo, quando a revisão de contêiner é criada. Os valores possíveis incluem: provisionamento, provisionado, com falha. Verifique se o aplicativo está em execução. string Sim
environmentId A ID do ambiente do seu aplicativo de contêiner. Essa é uma propriedade necessária para criar um aplicativo de contêiner. Se você estiver usando YAML, poderá especificar a ID do ambiente usando a opção na CLI do --environment Azure. string Não
latestRevisionName O nome da última revisão. string Sim
latestRevisionFqdn A URL da última revisão. string Sim

O valor environmentId assume a seguinte forma:

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

Neste exemplo, você coloca seus valores no lugar dos tokens de espaço reservado entre colchetes <>.

properties.configuration

O objeto de properties.configuration um recurso inclui as seguintes propriedades:

Propriedade Descrição Tipo de dados
activeRevisionsMode Configurá-lo como single desativa automaticamente revisões antigas e mantém apenas a última revisão ativa. Configurá-lo como multiple permite que você mantenha várias revisões. string
secrets Define valores secretos no seu aplicativo de contêiner. objeto
ingress O objeto que define a configuração de acessibilidade pública de um aplicativo de contêiner. objeto
registries O objeto de configuração que faz referência a credenciais de registros de contêiner privado. Entradas definidas com o secretref fazem referência ao objeto de configuração de segredos. objeto
dapr O objeto de configuração que define as configurações do Dapr para o aplicativo de contêiner. objeto

As alterações feitas na seção configuration são alterações no escopo do aplicativo, que não disparam uma nova revisão.

properties.template

O objeto de properties.template um recurso inclui as seguintes propriedades:

Propriedade Descrição Tipo de dados
revisionSuffix Um nome amigável para uma revisão. Esse valor precisa ser exclusivo, pois o runtime rejeita todos os conflitos com os valores de sufixo de nome de revisão existentes. string
containers O objeto de configuração que define quais imagens de contêiner estão inclusas no aplicativo de contêiner. objeto
scale O objeto de configuração que define as regras de escala do aplicativo de contêiner. objeto

As alterações feitas na seção template são alterações no escopo da revisão, o que dispara uma nova revisão.

Exemplos

Para obter detalhes sobre testes de integridade, consulte Testes de integridade em Aplicativos de Contêiner do Azure.

O trecho de modelo ARM de exemplo a seguir implanta um aplicativo de contêiner.

{
  "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"
        }
      ]
    }
  }
}

Trabalho de aplicativos de contêiner

As tabelas a seguir descrevem as propriedades comumente usadas no recurso de trabalho Aplicativos de Contêiner. Para obter uma lista completa de propriedades, consulte Referência da API REST dos Aplicativos de Contêiner do Azure.

Recurso

O objeto de um recurso de properties trabalho de Aplicativos de Contêiner inclui as seguintes propriedades:

Propriedade Descrição Tipo de dados Somente leitura
environmentId A ID do ambiente para seu trabalho de Aplicativos de Contêiner. Essa propriedade é necessária para criar um trabalho de Aplicativos de Contêiner. Se você estiver usando YAML, poderá especificar a ID do ambiente usando a opção na CLI do --environment Azure. string Não

O valor environmentId assume a seguinte forma:

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

Neste exemplo, você coloca seus valores no lugar dos tokens de espaço reservado entre colchetes <>.

properties.configuration

O objeto de properties.configuration um recurso inclui as seguintes propriedades:

Propriedade Descrição Tipo de dados
triggerType O tipo de gatilho para um trabalho de Aplicativos de Contêiner. Para obter uma configuração específica para cada tipo de disparador, consulte Tipos de gatilho de trabalhos string
replicaTimeout O tempo limite em segundos para um trabalho de Aplicativos de Contêiner. Número inteiro
replicaRetryLimit O número de vezes para repetir um trabalho de Aplicativos de Contêiner. Número inteiro

properties.template

O objeto de properties.template um recurso inclui as seguintes propriedades:

Propriedade Descrição Tipo de dados
containers Objeto de configuração que define quais imagens de contêiner são incluídas no trabalho. objeto
scale Objeto de configuração que define regras de escala para o trabalho. objeto

Exemplos

O exemplo de snippet de modelo ARM a seguir implanta um trabalho de Aplicativos de Contêiner.

{
  "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"
            }
          ]
        }
      ]
    }
  }
}