Implantar um aplicativo Python em contêiner no Serviço de Aplicativo
Este artigo faz parte de um tutorial sobre como contentorizar e implementar uma aplicação Web Python no Serviço de Aplicações do Azure. O Serviço de Aplicativo permite que você execute aplicativos Web em contêineres e implante por meio de recursos de integração contínua/implantação contínua (CI/CD) com o Docker Hub, o Registro de Contêiner do Azure e o Visual Studio Team Services.
Nesta parte do tutorial, você aprenderá a implantar o aplicativo Web Python em contêiner no Serviço de Aplicativo usando o Aplicativo Web do Serviço de Aplicativo para Contêineres. O Web App for Containers permite que você se concentre em compor seus contêineres sem se preocupar em gerenciar e manter um orquestrador de contêineres subjacente.
Seguindo as etapas aqui, você acabará com um site do Serviço de Aplicativo usando uma imagem de contêiner do Docker. O Serviço de Aplicativo extrai a imagem inicial do Registro de Contêiner do Azure usando identidade gerenciada para autenticação.
O diagrama de serviço mostrado abaixo destaca os componentes abordados neste artigo.
1. Crie o aplicativo Web
Os comandos da CLI do Azure podem ser executados no Azure Cloud Shell ou em uma estação de trabalho com a CLI do Azure instalada.
Passo 1. Obtenha a ID do recurso do grupo que contém o Registro de Contêiner do Azure com o comando az group show .
# RESOURCE_GROUP_NAME='msdocs-web-app-rg'
RESOURCE_ID=$(az group show \
--resource-group $RESOURCE_GROUP_NAME \
--query id \
--output tsv)
echo $RESOURCE_ID
No comando acima, RESOURCE_GROUP_NAME ainda deve ser definido em seu ambiente para o nome do grupo de recursos usado na parte 3. Criar contêiner no Azure deste tutorial. Se não estiver, descomente a primeira linha e certifique-se de que está definida para o nome que usou.
Passo 2. Crie um plano do Serviço de Aplicações com o comando az appservice plan create.
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-linux
Passo 3. Crie um aplicativo Web com o comando az webapp create .
O comando a seguir também habilita a identidade gerenciada atribuída pelo sistema para o aplicativo Web e atribui a ele a AcrPull
função no recurso especificado - neste caso, o grupo de recursos que contém o Registro de Contêiner do Azure. Isso concede aos privilégios de pull de identidade gerenciada atribuídos pelo sistema em qualquer Registro de Contêiner do Azure no grupo de recursos.
APP_SERVICE_NAME='<website-name>'
# REGISTRY_NAME='<your Azure Container Registry name>'
CONTAINER_NAME=$REGISTRY_NAME'.azurecr.io/msdocspythoncontainerwebapp:latest'
az webapp create \
--resource-group $RESOURCE_GROUP_NAME \
--plan $APP_SERVICE_PLAN_NAME \
--name $APP_SERVICE_NAME \
--assign-identity '[system]' \
--scope $RESOURCE_ID \
--role acrpull \
--deployment-container-image-name $CONTAINER_NAME
No comando acima:
- APP_SERVICE_NAME deve ser globalmente exclusivo, pois se torna o nome do site na URL
https://<website-name>.azurewebsites.net
. - CONTAINER_NAME é da forma "yourregistryname.azurecr.io/repo_name:tag".
- REGISTRY_NAME ainda deve ser definido em seu ambiente para o nome do Registro usado na Parte 3. Criar contêiner no Azure deste tutorial. Se não estiver, descomente a linha onde está definida acima e certifique-se de que está definida para o nome que usou.
Nota
Você pode ver um erro semelhante ao seguinte ao executar o comando:
No credential was provided to access Azure Container Registry. Trying to look up...
Retrieving credentials failed with an exception:'No resource or more than one were found with name ...'
Este erro ocorre porque a aplicação Web assume como predefinição utilizar as credenciais de administrador do Registo de Contentores do Azure para se autenticar com o registo e as credenciais de administrador não foram ativadas no registo. Você pode ignorar esse erro com segurança porque definirá o aplicativo Web para usar a identidade gerenciada atribuída pelo sistema para autenticação no próximo comando.
2. Configurar identidade gerenciada e webhook
Passo 1. Configure o aplicativo Web para usar identidades gerenciadas para extrair do Registro de Contêiner do Azure com o comando az webapp config set .
az webapp config set \
--resource-group $RESOURCE_GROUP_NAME \
--name $APP_SERVICE_NAME \
--generic-configurations '{"acrUseManagedIdentityCreds": true}'
Como você habilitou a identidade gerenciada atribuída ao sistema quando criou o aplicativo Web, ela será a identidade gerenciada usada para extrair do Registro de Contêiner do Azure.
Passo 2. Obtenha a credencial de escopo do aplicativo com o comando az webapp deployment list-publishing-credentials .
CREDENTIAL=$(az webapp deployment list-publishing-credentials \
--resource-group $RESOURCE_GROUP_NAME \
--name $APP_SERVICE_NAME \
--query publishingPassword \
--output tsv)
echo $CREDENTIAL
Passo 3. Use a credencial de escopo do aplicativo para criar um webhook com o comando az acr webhook create .
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
Por padrão, esse comando cria o webhook no mesmo grupo de recursos e local que o registro de Contêiner do Azure especificado. Se desejar, você pode usar os --resource-group
parâmetros e --location
para substituir esse comportamento.
3. Configurar a conexão com o MongoDB
Nesta etapa, você especifica as variáveis de ambiente necessárias para se conectar ao MongoDB.
Se você precisar criar um Azure Cosmos DB para MongoDB, recomendamos que siga as etapas para configurar o Cosmos DB para MangoDB na parte 2. Crie e teste o contêiner localmente deste tutorial. Quando terminar, você deverá ter uma cadeia de conexão do Azure Cosmos DB para MongoDB do formulário mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>
.
Você precisará das informações da cadeia de conexão do MongoDB para seguir as etapas abaixo.
Para definir variáveis de ambiente no Serviço de Aplicativo, crie configurações de aplicativo com o seguinte comando az webapp config appsettings set .
MONGO_CONNECTION_STRING='your Mongo DB connection string in single quotes'
MONGO_DB_NAME=restaurants_reviews
MONGO_COLLECTION_NAME=restaurants_reviews
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP_NAME \
--name $APP_SERVICE_NAME \
--settings CONNECTION_STRING=$MONGO_CONNECTION_STRING \
DB_NAME=$MONGO_DB_NAME \
COLLECTION_NAME=$MONGO_COLLECTION_NAME
- CONNECTION_STRING: Uma cadeia de conexão que começa com "mongodb://".
- DB_NAME: Use "restaurants_reviews".
- COLLECTION_NAME: Use "restaurants_reviews".
4. Navegue no site
Para verificar se o site está em execução, vá para https://<website-name>.azurewebsites.net
, onde nome do site é o nome do serviço de aplicativo. Se for bem-sucedido, você verá o aplicativo de exemplo de avaliação de restaurante. Pode levar alguns momentos para que o site comece pela primeira vez. Quando o site aparecer, adicione um restaurante e uma avaliação para esse restaurante para confirmar que o aplicativo de exemplo está funcionando.
Se você estiver executando a CLI do Azure localmente, poderá usar o comando az webapp browse para navegar até o site. Se você estiver usando o Cloud Shell, abra uma janela do navegador e navegue até o URL do site.
az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
Nota
O az webapp browse
comando não é suportado no Cloud Shell. Abra uma janela do navegador e navegue até o URL do site.
5. Solucionar problemas de implantação
Se você não vir o aplicativo de exemplo, tente as etapas a seguir.
- Com a implantação de contêiner e o Serviço de Aplicativo, sempre verifique a página Logs do Centro / de Implantação no portal do Azure. Confirme se o contêiner foi puxado 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/Logs de aplicativos.
- O aplicativo de exemplo depende de uma conexão com o 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 se 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 Aplicativo puxe a imagem do contêiner. Em particular, verifique se o URI do serviço termina com "/api/registry/webhook".
- Diferentes skus do Registro de Contêiner do Azure têm recursos diferentes, 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 registro 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.
Próximo passo
Clean up resources (Limpar recursos)