Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. 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 ter que manter seu próprio orquestrador de contêineres.
O Serviço de Aplicativo simplifica a implantação por meio de pipelines de integração contínua/implantação contínua (CI/CD) que funcionam com o Docker Hub, 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ê tem um aplicativo Web do Serviço de Aplicativo seguro e pronto para produção em execução a partir de uma imagem de contêiner do 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 Cofre de Chaves do Azure.
Este diagrama de serviço destaca os componentes abordados neste artigo.
Os comandos da CLI do Azure podem ser executados no Azure Cloud Shell ou em uma máquina local com a CLI do Azure instalada.
Importante
Recomendamos usar o Azure Cloud Shell para todas as etapas baseadas em CLI neste tutorial porque:
- Vem pré-autenticado com sua conta do Azure, evitando problemas de logon
- Inclui todas as extensões necessárias da CLI do Azure prontas para uso
- Garante um comportamento consistente, independentemente do seu SO ou ambiente local
- Não requer instalação local, ideal para usuários sem direitos de administrador
- Fornece acesso direto aos serviços do Azure a partir do portal, sem necessidade de Docker local ou configuração de rede
- Evita problemas de firewall local ou configuração de rede
Criar cofre de chaves com autorização RBAC
O Azure Key Vault é um serviço seguro para armazenar segredos, chaves de API, cadeias de conexão e certificados. Neste script, ele armazena a cadeia de conexão MongoDB e o elemento SECRET_KEY da aplicação web.
O Cofre da Chave está 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 das políticas de acesso tradicionais. O aplicativo Web usa sua identidade gerenciada atribuída ao sistema para recuperar segredos com segurança em tempo de execução.
Observação
Criar o Cofre da Chave com antecedência garante que as funções possam ser atribuídas antes de qualquer tentativa de acessar segredos. Também ajuda a evitar demoras na propagação nas 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ê usa o comando az keyvault create para criar um Cofre de Chaves do Azure 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 de serviço de aplicativo e o aplicativo Web
O Plano do Serviço de Aplicativo define os recursos de computação, a camada de preços e a região do seu aplicativo Web. O aplicativo Web executa seu aplicativo em contêiner e é provisionado com uma identidade gerenciada atribuída pelo sistema que é usada para autenticar com segurança no Registro de Contêiner do Azure (ACR) e no Cofre da Chave do Azure.
Nesta etapa, você executa as seguintes tarefas:
- Criar um Plano do Serviço de Aplicações
- Criar o aplicativo Web com sua identidade gerenciada
- Configurar o aplicativo Web para implantação usando uma imagem de contêiner específica
- Prepare-se para a implantação contínua via ACR
Observação
O aplicativo Web deve ser criado antes de atribuir acesso ao ACR ou ao Cofre da Chave, pois a identidade gerenciada só é criada no momento da implantação. Além disso, atribuir a imagem do contêiner durante a criação garante que o aplicativo seja iniciado corretamente com a configuração pretendida.
Nesta etapa, você usa 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ê usa o comando az webapp create para criar o aplicativo Web. Esse comando também habilita uma identidade gerenciada atribuída ao sistema e define a imagem de contêiner que o aplicativo executa.
#!/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"Observação
Ao executar este comando, 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, cujas credenciais são desabilitadas por padrão. É seguro ignorar esta mensagem: a próxima etapa configura o aplicativo Web para usar sua identidade gerenciada para autenticar com o ACR.
Conceder Função de Oficial de Segredos ao usuário conectado
Para armazenar segredos no Cofre de Chaves do Azure, o usuário que executa o script deve ter a função de Oficial de Segredos do Cofre de Chaves . 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 então armazenar com segurança segredos do aplicativo, como a cadeia de conexão MongoDB e o SECRET_KEY.
Esta atribuição de função é a primeira de duas relacionadas com o Key Vault. Mais tarde, à identidade gerida atribuída pelo sistema da aplicação web é concedido acesso para recuperar segredos do repositório.
O uso do RBAC do Azure garante acesso seguro e auditável com base na identidade, eliminando a necessidade de credenciais codificadas.
Observação
O usuário deve receber a função de Oficial de Segredos do Cofre de Chavesantes de tentar armazenar quaisquer segredos no cofre de chaves. Essa atribuição é feita usando o comando az role assignment create no âmbito do Azure Key Vault.
Nesta etapa, você usa o comando az role assignment create para atribuir a função no escopo do Cofre de Chaves.
#!/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 identidade gerenciada
Para extrair imagens do Registro de Contêiner do Azure (ACR) com segurança, o aplicativo Web deve ser configurado para usar sua identidade gerenciada atribuída ao sistema. O uso da identidade gerenciada evita a necessidade de credenciais de administrador e oferece suporte à implantação segura e sem credenciais.
Este processo envolve duas acções-chave:
- Permitindo que o aplicativo Web use 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 exclusivo) 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 ACR definindo a
acrUseManagedIdentityCredspropriedade comotrueusando 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 aplicativo Web 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 MongoDB e o SECRET_KEY. Para conceder essas permissões, você deve atribuir a função Usuário de Segredos do Cofre de Chaves à identidade gerenciada atribuída pelo sistema do aplicativo Web.
Nesta etapa, você usa o identificador exclusivo (ID principal) da identidade gerenciada atribuída pelo sistema do aplicativo Web para conceder ao aplicativo Web acesso ao Cofre de Chaves com a função Usuário de Segredos do Cofre de Chaves usando o comando az role assignment create .
#!/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 Cofre da Chave
Para evitar segredos de codificação em seu aplicativo, esta etapa armazena a cadeia de conexão MongoDB e a chave secreta do aplicativo Web no Cofre de Chaves do Azure. Esses segredos podem ser acessados com segurança pelo aplicativo Web em tempo de execução por meio de sua identidade gerenciada, sem a necessidade de armazenar credenciais em código ou configuração.
Observação
Embora este tutorial armazene apenas a cadeia de conexão e a chave secreta no cofre de chaves, você pode, opcionalmente, armazenar outras configurações do aplicativo, como o nome do banco de dados MongoDB ou o nome da coleção no Cofre da Chave.
Nesta etapa, você usa o comando az cosmosdb keys list para recuperar a cadeia de conexão MongoDB. Em seguida, use o comando az keyvault secret set para armazenar a cadeia de conexão e uma chave secreta gerada aleatoriamente no Cofre da Chave.
#!/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 os segredos do Kay Vault
Para acessar segredos com segurança em tempo de execução, o aplicativo Web deve ser configurado para fazer referência aos segredos armazenados no Cofre da Chave do Azure. Esta 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 ao 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 MongoDB e a chave secreta durante a execução.
Nesta etapa, você usa o comando az webapp config appsettings set para adicionar configurações do aplicativo que fazem referência aos segredos do Cofre da Chave. Especificamente, isso define as configurações de
MongoConnectionStringeMongoSecretKeydo aplicativo para fazer referência aos 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"
Habilite a implantação contínua a partir do ACR
Habilitar a implantação contínua permite que o aplicativo Web extraia e execute automaticamente a imagem de contêiner mais recente sempre que uma for enviada por push para o Registro de Contêiner do Azure (ACR). Isso reduz as etapas de implantação manual e ajuda a garantir que seu aplicativo permaneça atualizado.
Observação
Na próxima etapa, você registrará um webhook no ACR para notificar o aplicativo Web quando uma nova imagem for enviada.
Nesta etapa, você usa o comando az webapp deployment container config 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
Registrar um Webhook ACR para implantação contínua
Para automatizar implantações, registre um webhook no Azure Container Registry (ACR) que notifica o aplicativo Web sempre que uma nova imagem de contêiner é enviada por push. O webhook permite que o aplicativo puxe e execute automaticamente a versão mais recente.
O webhook configurado no Azure Container Registry (ACR) envia uma solicitação POST para o ponto de extremidade SCM (SERVICE_URI) do aplicativo Web sempre que uma nova imagem é enviada por push para o repositório msdocspythoncontainerwebapp. Essa ação aciona o aplicativo Web para extrair e implantar a imagem atualizada, concluindo o pipeline de implantação contínua entre o ACR e o Serviço de Aplicativo do Azure.
Observação
O URI do webhook deve seguir este formato:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook
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
Navegar no site
Para verificar se o aplicativo Web está em execução, abra https://<website-name>.azurewebsites.net, substituindo <website-name> pelo nome do seu Serviço de Aplicativo. Você deve ver o aplicativo de exemplo de avaliação de restaurante. Pode levar alguns momentos para carregar a primeira vez.
Quando o site aparecer, tente adicionar um restaurante e enviar uma avaliação para confirmar se o aplicativo está funcionando corretamente.
Observação
O comando az webapp browse não é suportado no Cloud Shell. Se você estiver usando o Cloud Shell, abra manualmente um navegador e navegue até o URL do site.
Se você estiver usando a CLI do Azure localmente, poderá usar o comando az webapp browse para abrir o site em seu navegador padrão:
az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
Observação
O comando az webapp browse não é suportado no Cloud Shell. Abra uma janela do navegador e navegue até o URL do site.
Solucionar problemas de implantação
Se não conseguir ver a aplicação de exemplo, tente os passos seguintes.
- Com a implantação de contentores e o Serviço de Aplicações, verifique sempre a página de Registos
do Centro de Implantação no portal do Azure. Confirme se o contêiner foi extraído e está em execução. A tração inicial do recipiente pode demorar alguns momentos. - Tente reiniciar o Serviço de Aplicativo e veja 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/registos da Aplicação.
- 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, vá para o recurso Centro de Implantação do Serviço de Aplicativo e confirme que 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 obtenha a imagem do contentor. Em particular, verifique se o URI do serviço termina com "/api/registry/webhook". Se não, adicione-o.
- Diferentes SKUs do Registro de Contêiner do Azure têm recursos diferentes, incluindo o número de webhooks. Se estiver a reutilizar um registo existente, poderá ver a mensagem: "Cota excedida para webhooks do tipo de recurso no registo SKU Basic. Saiba mais sobre diferentes cotas de SKU e processo de atualização: https://aka.ms/acr/tiers". Se vir esta mensagem, utilize um novo registo ou reduza o número de webhooks de registo em utilização.