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.
Podes executar CLI do Azure comandos no Azure Cloud Shell ou numa máquina local com o CLI do Azure instalado.
Importante
Use Azure Cloud Shell para todos os passos baseados em CLI neste tutorial porque:
- Vem pré-autenticado com a tua conta Azure, para não teres problemas de autenticação
- Inclui todas as extensões necessárias do CLI do Azure
- 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.
Configure o Key Vault para usar o controlo de acesso baseado em papéis (RBAC) para gerir o acesso através de funções do Azure em vez das tradicionais políticas de acesso. O aplicativo Web usa sua identidade gerenciada atribuída ao sistema para recuperar segredos com segurança em tempo de execução.
Observação
Crie o Key Vault cedo para garantir que pode atribuir papéis antes de qualquer tentativa de aceder a segredos. Esta abordagem também ajuda a evitar atrasos na propagação nas atribuições de funções. Como o Key Vault não depende do App Service, provisioná-lo antecipadamente melhora a fiabilidade e o sequenciamento.
Use o comando az keyvault create para criar um Azure Key Vault com RBAC ativado.
#!/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. A aplicação web executa a sua aplicação containerizada e está equipada com uma identidade gerida atribuída pelo sistema, que utiliza para autenticar de forma segura no Azure Container Registry (ACR) e no Azure Key Vault.
Neste passo, complete as seguintes tarefas:
- Criar um Plano do Serviço de Aplicações
- Criar o aplicativo Web com sua identidade gerenciada
- Configure a aplicação web para ser implementada usando uma imagem de contentor específica
- Prepare-se para a implantação contínua via ACR
Observação
Deve criar a aplicação web antes de atribuir acesso ao ACR ou Key Vault porque a identidade gerida é criada apenas aquando da implementaçã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.
Utilize o comando az appservice plan create para provisionar o ambiente de computação para a sua aplicação.
#!/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-linuxUsa o comando criação da aplicação web az para criar a aplicação 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, pode 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.'Este erro ocorre porque a aplicação web tenta usar credenciais de administrador para aceder ao ACR, mas as credenciais de administrador estão desativadas por defeito. Pode ignorar esta mensagem. O passo seguinte configura a aplicação web para usar a sua identidade gerida para se autenticar com o ACR.
Conceder o papel de Oficial de Segredos do Key Vault ao utilizador autenticado
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 . Este papel concede permissão para criar e gerir segredos dentro do cofre.
Neste passo, o script atribui esse papel ao utilizador atualmente autenticado. 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.
Ao usar Azure RBAC, garante acesso seguro e auditável com base na identidade, por isso não precisa de usar credenciais codificadas fixamente.
Observação
Atribua a função de Key Vault Secrets Officer ao utilizador antes de este tentar armazenar quaisquer segredos no cofre de chaves. Utilize o comando az role assignment create com o âmbito definido para o Key Vault para efetuar esta atribuição.
Use o comando az role assignment create para atribuir o papel no âmbito 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 identidade gerenciada
Para extrair imagens do Azure Container Registry (ACR) de forma segura, configure a aplicação web para usar a sua identidade gerida atribuída ao sistema. Ao usar identidade gerida, não precisa de credenciais de administrador e pode suportar uma implementaçã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
Neste passo, recupere o principal ID (ID único do objeto) da identidade gerida da aplicação web usando o comando az webapp identity show . Em seguida, ative a utilização da identidade gerida para autenticação no ACR, definindo a propriedade
acrUseManagedIdentityCredscomotrueao utilizar az webapp config set. Depois, atribua a função AcrPull à identidade gerida da aplicação Web ao usar 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 estas permissões, atribui o papel Key Vault Secrets User à identidade gerida atribuída ao sistema da aplicação web.
Neste passo, utilize o identificador único (principal ID) da identidade gerida atribuída ao sistema da aplicação web para conceder à aplicação web acesso ao Key Vault com o papel Key Vault Secrets User 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"
Guardar segredos no Key Vault
Para evitar codificar segredos rígidos na sua aplicação, armazene o MongoDB cadeia de ligação e a chave secreta da aplicação web em Azure Key Vault. A aplicação web pode aceder de forma segura a estes segredos em tempo de execução através da sua identidade gerida, por isso não precisa 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.
Utilize o comando az cosmosdb keys list para obter a cadeia de ligação do MongoDB. Depois, usa o comando az keyvault secret set para armazenar tanto a cadeia de ligação como 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 a aplicação web para usar os segredos do Key Vault
Para aceder aos segredos de forma segura em tempo de execução, configure a aplicação web para referenciar os segredos armazenados no Azure Key Vault. Use referências Key Vault para injetar os valores secretos no ambiente da aplicação através da sua identidade gerida 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.
Use o comando az webapp config appsettings set para adicionar definições de aplicação que referenciam os segredos Key Vault. Especificamente, defina as definições da aplicação
MongoConnectionStringeMongoSecretKeypara referenciarem os respetivos segredos armazenados em 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
Quando ativa a implementação contínua, a aplicação web puxa e executa automaticamente a imagem mais recente do contentor sempre que envia uma para o Azure Container Registry (ACR). Esta funcionalidade reduz os passos manuais de implementação e ajuda a garantir que a sua aplicação se mantém atualizada.
Observação
No passo seguinte, regista um webhook no ACR para notificar a aplicação web quando é enviada uma nova imagem.
Utilize o comando az webapp deployment container config para ativar a implementação contínua a partir do ACR para a aplicação Web.
#!/bin/bash az webapp deployment container config \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --enable-cd true
Registar um webhook do 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. Ao usar o webhook, a aplicação puxa e executa automaticamente a versão mais recente.
O webhook que configura no Azure Container Registry (ACR) envia um pedido POST para o endpoint SCM (SERVICE_URI) da aplicação web sempre que uma nova imagem é enviada 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.
Utilize o comando az acr webhook create para registar o webhook e configurá-lo para ser acionado em eventos
push.#!/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 demorar alguns momentos a carregar à primeira.
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 estiveres a usar Cloud Shell, abre manualmente um navegador e vai ao URL do site.
Se estiver a usar o CLI do Azure localmente, use o comando az webapp browse para abrir o site no seu navegador predefinido:
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 vá ao URL do site em vez disso.
Solucionar problemas de implantação
Se não conseguir ver a aplicação de exemplo, tente os passos seguintes.
- Para implementação de contentores e Serviços de Aplicações, verifique sempre a página Centro de Implementação / Logs no portal Azure. Confirma que o contentor está puxado e a funcionar. 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: "Quota excedida para webhooks de tipo de recurso para o SKU Basic do registo. 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.