Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Nesta parte da série de tutoriais, você aprenderá a implantar um aplicativo Web Python em contêineres no Aplicativo Web do Serviço de Aplicativo do Azure para Contêineres. Esse serviço totalmente gerenciado permite que você execute aplicativos em contêineres sem precisar manter seu próprio orquestrador de contêineres.
O Serviço de Aplicativo simplifica a implantação por meio de pipelines de CI/CD (integração contínua/implantação contínua) que funcionam com o Hub do Docker, o Registro de Contêiner do Azure, o Azure Key Vault e outras ferramentas de DevOps. Este tutorial é a parte 4 de uma série de tutoriais de 5 partes.
No final deste artigo, você terá um aplicativo seguro para a web, pronto para produção, executando no App Service a partir de uma imagem de contêiner Docker. O aplicativo usa uma identidade gerenciada atribuída pelo sistema para extrair a imagem do Registro de Contêiner do Azure e recuperar segredos do Azure Key Vault.
Este diagrama de serviço realça os componentes abordados neste artigo.
Os comandos da CLI do Azure podem ser executados no Azure Cloud Shell ou em um computador local com a CLI do Azure instalada.
Importante
É recomendável usar o Azure Cloud Shell para todas as etapas baseadas na CLI neste tutorial porque:
- Vem pré-autenticado com sua conta do Azure, evitando problemas de logon
- Inclui todas as extensões da CLI do Azure necessárias prontas
- Garante um comportamento consistente independentemente do seu sistema operacional ou ambiente local
- Não requer nenhuma instalação local, ideal para usuários sem direitos de administrador
- Fornece acesso direto aos serviços do Azure por meio do portal — nenhuma configuração local do Docker ou da rede necessária
- Evita problemas de configuração de rede ou firewall local
Criar o Key Vault com autorização do RBAC
O Azure Key Vault é um serviço seguro para armazenar segredos, chaves de API, cadeias de conexão e certificados. Nesse script, ele armazena a cadeia de conexão do MongoDB e a do SECRET_KEYaplicativo Web.
O Key Vault é configurado para usar o RBAC (controle de acesso baseado em função) para gerenciar o acesso por meio de funções do Azure em vez de políticas de acesso tradicionais. O aplicativo Web usa sua identidade gerenciada atribuída pelo sistema para recuperar segredos com segurança no runtime.
Nota
Criar o Key Vault antecipadamente garante que as funções possam ser atribuídas antes de qualquer tentativa de acessar segredos. Ele também ajuda a evitar atrasos de propagação em atribuições de funções. Como o Key Vault não depende do Serviço de Aplicativo, provisioná-lo antecipadamente melhora a confiabilidade e o sequenciamento.
Nesta etapa, você usará o comando az keyvault create para criar um Azure Key Vault com RBAC habilitado.
#!/bin/bash RESOURCE_GROUP_NAME="msdocs-web-app-rg" LOCATION="westus" KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv" az keyvault create \ --name "$KEYVAULT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --location "$LOCATION" \ --enable-rbac-authorization true
Criar o plano do serviço de aplicativo e o aplicativo Web
O Plano do Serviço de Aplicativo define os recursos de computação, o tipo de preço e a região do aplicativo Web. O aplicativo Web executa seu aplicativo em contêineres e é provisionado com uma identidade gerenciada atribuída pelo sistema que é usada para autenticar com segurança no ACR (Registro de Contêiner do Azure) e no Azure Key Vault.
Nesta etapa, você executará as seguintes tarefas:
- Criar um Plano do Serviço de Aplicativo
- Criar o aplicativo Web com sua identidade gerenciada
- Configurar o aplicativo Web para implantar usando uma imagem de contêiner específica
- Prepare-se para implantação contínua via ACR
Nota
O aplicativo Web deve ser criado antes de atribuir acesso ao ACR ou ao Key Vault porque a identidade gerenciada só é criada no momento da implantação. Além disso, atribuir a imagem de contêiner durante a criação garante que o aplicativo seja iniciado corretamente com a configuração pretendida.
Nesta etapa, você usará o comando az appservice plan create para provisionar o ambiente de computação para seu aplicativo.
#!/bin/bash APP_SERVICE_PLAN_NAME="msdocs-web-app-plan" az appservice plan create \ --name "$APP_SERVICE_PLAN_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --sku B1 \ --is-linuxNesta etapa, você usará o comando az webapp create para criar o aplicativo Web. Esse comando também habilita uma identidade gerenciada atribuída pelo sistema e define a imagem de contêiner executada pelo aplicativo.
#!/bin/bash APP_SERVICE_NAME="msdocs-website-name" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`. # Use the same registry name as in part 2 of this tutorial series. REGISTRY_NAME="msdocscontainerregistryname" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial. CONTAINER_NAME="$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest" #CONTAINER_NAME is of the form "yourregistryname.azurecr.io/repo_name:tag". az webapp create \ --resource-group "$RESOURCE_GROUP_NAME" \ --plan "$APP_SERVICE_PLAN_NAME" \ --name "$APP_SERVICE_NAME" \ --assign-identity '[system]' \ --deployment-container-image-name "$CONTAINER_NAME"Nota
Ao executar este comando, você poderá ver o seguinte erro:
No credential was provided to access Azure Container Registry. Trying to look up... Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'Esse erro ocorre porque o aplicativo Web tenta usar credenciais de administrador para acessar o ACR, quais credenciais são desabilitadas por padrão. É seguro ignorar essa mensagem: a próxima etapa configura o aplicativo Web para usar sua identidade gerenciada para autenticar com o ACR.
Conceder a Função de Oficial de Segredos ao usuário conectado
Para armazenar segredos no Azure Key Vault, o usuário que executa o script deve ter a função Key Vault Secrets Officer . Essa função permite criar e gerenciar segredos dentro do cofre.
Nesta etapa, o script atribui essa função ao usuário conectado no momento. Esse usuário pode armazenar com segurança os segredos do aplicativo, como a cadeia de conexão do MongoDB e do aplicativo SECRET_KEY.
Essa atribuição de função é a primeira de duas atribuições de função relacionadas ao Key Vault. Posteriormente, a identidade gerenciada atribuída pelo sistema do aplicativo Web recebe acesso para recuperar segredos do cofre.
O uso do RBAC do Azure garante acesso seguro e auditável com base na identidade, eliminando a necessidade de credenciais codificadas.
Nota
O usuário deve receber a função Key Vault Secrets Officerantes de tentar armazenar os segredos no cofre de chaves. Essa atribuição é feita usando o comando az role assignment create com escopo para o Key Vault.
Nesta etapa, você usará o comando az role assignment create para atribuir a função no escopo do Key Vault.
#!/bin/bash CALLER_ID=$(az ad signed-in-user show --query id -o tsv) echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully. az role assignment create \ --role "Key Vault Secrets Officer" \ --assignee "$CALLER_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Conceder acesso à Web ao ACR usando a identidade gerenciada
Para efetuar pull de imagens do ACR (Registro de Contêiner do Azure) com segurança, o aplicativo Web deve ser configurado para usar sua identidade gerenciada atribuída pelo sistema. O uso de identidade gerenciada evita a necessidade de credenciais de administrador e dá suporte à implantação segura e sem credenciais.
Esse processo envolve duas ações principais:
- Habilitando o aplicativo Web para usar sua identidade gerenciada ao acessar o ACR
- Atribuindo a função AcrPull a essa identidade no ACR de destino
Nesta etapa, você recupera a ID principal (ID de objeto único) da identidade gerenciada do aplicativo web usando o comando az webapp identity show. Em seguida, você habilita o uso da identidade gerenciada para autenticação do ACR definindo a
acrUseManagedIdentityCredspropriedade paratrueusando az webapp config set. Em seguida, você atribui a função AcrPull à identidade gerenciada do aplicativo Web usando o comando az role assignment create . Essa função concede ao web app permissão para extrair imagens do registro.#!/bin/bash PRINCIPAL_ID=$(az webapp identity show \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --query principalId \ -o tsv) echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`. az webapp config set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --generic-configurations '{"acrUseManagedIdentityCreds": true}' az role assignment create \ --role "AcrPull" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
Conceder acesso ao cofre de chaves à identidade gerenciada do aplicativo web
O aplicativo Web precisa de permissão para acessar segredos como a cadeia de conexão do MongoDB e a SECRET_KEY. Para conceder essas permissões, você deve atribuir a função de Usuário de Segredos do Key Vault à identidade gerenciada atribuída pelo sistema do aplicativo Web.
Nesta etapa, você usará o identificador único (ID principal) da identidade gerenciada atribuída pelo sistema do aplicativo Web para conceder ao aplicativo Web acesso ao Key Vault com a função Usuário de Segredos do Key Vault usando o comando az role assignment create do CLI Azure.
#!/bin/bash az role assignment create \ --role "Key Vault Secrets User" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Armazenar segredos no Key Vault
Para evitar segredos de codificação em seu aplicativo, esta etapa armazena a cadeia de conexão do MongoDB e a chave secreta do aplicativo Web no Azure Key Vault. Esses segredos podem ser acessados com segurança pelo aplicativo Web em runtime por meio de sua identidade gerenciada, sem a necessidade de armazenar credenciais em código ou configuração.
Nota
Embora este tutorial armazene apenas a cadeia de conexão e a chave secreta no cofre de chaves, você também pode armazenar outras configurações de aplicativo, como o nome do banco de dados do MongoDB ou o nome da coleção no Key Vault.
Nesta etapa, você usará o comando de lista de chaves do az cosmosdb para recuperar a cadeia de conexão do MongoDB. Em seguida, use o comando az keyvault secret set para armazenar a cadeia de conexão e uma chave secreta gerada aleatoriamente no Key Vault.
#!/bin/bash ACCOUNT_NAME="msdocs-cosmos-db-account-name" MONGO_CONNECTION_STRING=$(az cosmosdb keys list \ --name "$ACCOUNT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --type connection-strings \ --query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv) SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9') # This key is cryptographically secure, using OpenSSL’s strong random number generator. az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoConnectionString" \ --value "$MONGO_CONNECTION_STRING" az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoSecretKey" \ --value "$SECRET_KEY"
Configurar o aplicativo web para usar segredos do Kay Vault
Para acessar segredos com segurança em runtime, o aplicativo Web deve ser configurado para fazer referência aos segredos armazenados no Azure Key Vault. Essa etapa é feita usando referências do Key Vault, que injetam os valores secretos no ambiente do aplicativo por meio de sua identidade gerenciada atribuída pelo sistema.
Essa abordagem evita segredos de codificação e permite que o aplicativo recupere com segurança valores confidenciais, como a cadeia de conexão do MongoDB e a chave secreta durante a execução.
Nesta etapa, você usará o comando az webapp config appsettings set para adicionar configurações de aplicativo que fazem referência aos segredos do Key Vault. Especificamente, isso define as configurações do aplicativo
MongoConnectionStringeMongoSecretKeypara referenciar os segredos correspondentes armazenados no Key Vault.#!/bin/bash MONGODB_NAME="restaurants_reviews" MONGODB_COLLECTION_NAME="restaurants_reviews" az webapp config appsettings set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --settings \ CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" \ SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" \ DB_NAME="$MONGODB_NAME" \ COLLECTION_NAME="$MONGODB_COLLECTION_NAME"
Habilitar a implantação contínua a partir do ACR
Habilitar a implantação contínua permite que o aplicativo Web efetue pull e execute automaticamente a imagem de contêiner mais recente sempre que uma for enviada por push para o ACR (Registro de Contêiner do Azure). Isso reduz as etapas de implantação manual e ajuda a garantir que seu aplicativo permaneça atualizado.
Nota
Na próxima etapa, você registrará um webhook no ACR para notificar o aplicativo web quando uma nova imagem for enviada.
Nesta etapa, você usará o comando de configuração de contêiner de implantação do az webapp para habilitar a implantação contínua do ACR para o aplicativo Web.
#!/bin/bash az webapp deployment container config \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --enable-cd true
Registre um Webhook do ACR para a implantação contínua
Para automatizar implantações, registre um webhook no ACR (Registro de Contêiner do Azure) que notifica o aplicativo Web sempre que uma nova imagem de contêiner é enviada por push. O webhook permite que o aplicativo obtenha e execute automaticamente a versão mais recente.
O webhook configurado no Registro de Contêiner do Azure (ACR) envia uma solicitação POST para o ponto de extremidade SCM do aplicativo web (SERVICE_URI) sempre que uma nova imagem é enviada para o repositório msdocspythoncontainerwebapp. Essa ação aciona o aplicativo Web para realizar o pull e implementar a imagem atualizada, concluindo o pipeline de implantação contínua entre o ACR e o Serviço de Aplicativo do Azure.
Nota
O URI do webhook deve seguir este formato:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook
Ele deve terminar com /api/registry/webhook. Se você receber um erro de URI, confirme se o caminho está correto.
Nesta etapa, use o comando az acr webhook create para registrar o webhook e configurá-lo para disparar em
pusheventos.#!/bin/bash CREDENTIAL=$(az webapp deployment list-publishing-credentials \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --query publishingPassword --output tsv) # Web app publishing credentials may not be available immediately. In production, poll until non-empty. SERVICE_URI="https://$APP_SERVICE_NAME:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook" az acr webhook create \ --name webhookforwebapp \ --registry "$REGISTRY_NAME" \ --scope msdocspythoncontainerwebapp:* \ --uri "$SERVICE_URI" \ --actions push
Navegue pelo site
Para verificar se o aplicativo Web está em execução, abra https://<website-name>.azurewebsites.net, substituindo <website-name> pelo nome do Serviço de Aplicativo. Você precisa conferir o aplicativo de amostra de avaliações de restaurante. Pode levar alguns instantes para carregar na primeira vez.
Depois que o site for exibido, tente adicionar um restaurante e enviar uma revisão para confirmar se o aplicativo está funcionando corretamente.
Nota
O comando az webapp browse não tem suporte no Cloud Shell. Se você estiver usando o Cloud Shell, abra manualmente um navegador e navegue até a URL do site.
Se você estiver usando a CLI do Azure localmente, poderá usar o comando az webapp browse para abrir o site no navegador padrão:
az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
Nota
O comando az webapp browse não tem suporte no Cloud Shell. Abra uma janela do navegador e navegue até a URL do site.
Solucionar problemas de implantação
Se você não vir o aplicativo de exemplo, experimente as etapas a seguir.
- Com a implantação de contêiner e o Serviço de Aplicativo, sempre verifique a página Centro de Implantação / Logs no portal do Azure. Confirme se o contêiner foi extraído e está em execução. A extração e execução iniciais do contêiner podem demorar alguns instantes.
- Tente reiniciar o Serviço de Aplicativo e ver se isso resolve o problema.
- Se houver erros de programação, esses erros aparecerão nos logs do aplicativo. Na página do portal do Azure para o Serviço de Aplicativo, selecione Diagnosticar e resolver problemas/Logs de Aplicativos.
- O aplicativo de exemplo depende de uma conexão com o Azure Cosmos DB para MongoDB. Confirme se o Serviço de Aplicativo tem configurações de aplicativo com as informações de conexão corretas.
- Confirme se a identidade gerenciada está habilitada para o Serviço de Aplicativo e é usada no Centro de Implantação. Na página do portal do Azure para o Serviço de Aplicativo, acesse o recurso Centro de Implantação do Serviço de Aplicativo e confirme se a Autenticação está definida como Identidade Gerenciada .
- Verifique se o webhook está definido no Registro de Contêiner do Azure. O webhook permite que o Serviço de Aplicações busque a imagem do contêiner. Em particular, verifique se o URI do Serviço termina com "/api/registry/webhook". Caso contrário, adicione-o.
- Diferentes SKUs do Registro de Contêiner do Azure possuem recursos distintos, incluindo o número de webhooks. Se você estiver reutilizando um registro existente, poderá ver a mensagem: "Cota excedida para webhooks de tipo de recurso para o SKU de registro Basic." Saiba mais sobre diferentes cotas de SKU e o processo de atualização: https://aka.ms/acr/tiers". Se você vir essa mensagem, use um novo registro ou reduza o número de webhooks de registro em uso.