【计算机工具类-云服务Skills】azd-deployment 技能 使用Azure Developer CLI (azd)将容器化前端后端应用程序部署到Azure Container Apps支持远程构建、托管标识和幂等基础设施。下载地址agentic-awesome-skills/skills/azd-deployment at main · sickn33/agentic-awesome-skills · GitHub技能概述azd-deployment 技能提供了一种简化的方式来部署容器化应用程序到Azure Container Apps。该技能结合了Bicep基础设施即代码、远程容器构建和托管身份验证实现了端到端的开发到部署工作流程。支持幂等部署确保基础设施的一致性和可重复性。快速入门# Initialize and deployazd auth loginazd init # Creates azure.yaml and .azure/ folderazd env new # Create environment (dev, staging, prod)azd up # Provision infra build deploy核心文件结构project/├── azure.yaml # azd service definitions hooks├── infra/│ ├── main.bicep # Root infrastructure module│ ├── main.parameters.json # Parameter injection from env vars│ └── modules/│ ├── container-apps-environment.bicep│ └── container-app.bicep├── .azure/│ ├── config.json # Default environment pointer│ └── env-name/│ ├── .env # Environment-specific values (azd-managed)│ └── config.json # Environment metadata└── src/├── frontend/Dockerfile└── backend/Dockerfileazure.yaml配置最小配置name: azd-deploymentservices:backend:project: ./src/backendlanguage: pythonhost: containerappdocker:path: ./DockerfileremoteBuild: true完整配置含钩子name: azd-deploymentmetadata:template: my-project1.0.0infra:provider: biceppath: ./infraazure:location: eastus2services:frontend:project: ./src/frontendlanguage: tshost: containerappdocker:path: ./Dockerfilecontext: .remoteBuild: truebackend:project: ./src/backendlanguage: pythonhost: containerappdocker:path: ./Dockerfilecontext: .remoteBuild: truehooks:preprovision:shell: shrun: |echo Before provisioning...postprovision:shell: shrun: |echo After provisioning - set up RBAC, etc.postdeploy:shell: shrun: |echo Frontend: ${SERVICE_FRONTEND_URI}echo Backend: ${SERVICE_BACKEND_URI}关键azure.yaml选项选项描述remoteBuild: true在Azure Container Registry中构建镜像推荐context: .相对于项目路径的Docker构建上下文host: containerapp部署到Azure Container Appsinfra.provider: bicep使用Bicep进行基础设施定义环境变量流程三级配置本地.env- 仅用于本地开发.azure/env/.env- azd管理从Bicep输出自动填充main.parameters.json- 将环境变量映射到Bicep参数参数注入模式// infra/main.parameters.json{parameters: {environmentName: {value: ${AZURE_ENV_NAME}},location: {value: ${AZURE_LOCATIONeastus2}},azureOpenAiEndpoint: {value: ${AZURE_OPENAI_ENDPOINT}}}}语法${VAR_NAME} 或 ${VAR_NAMEdefault_value}设置环境变量# Set for current environmentazd env set AZURE_OPENAI_ENDPOINT https://my-openai.openai.azure.comazd env set AZURE_SEARCH_ENDPOINT https://my-search.search.windows.net# Set during initazd env new prodazd env set AZURE_OPENAI_ENDPOINT ...幂等部署为什么azd up是幂等的Bicep是声明式的- 资源协调到所需状态远程构建唯一标记- 镜像标签包含部署时间戳ACR重用层- 仅上传更改的层保留手动更改通过Portal添加的自定义域可能在重新部署时丢失。使用钩子保留hooks:preprovision:shell: shrun: |# Save custom domains before provisionif az containerapp show --name $FRONTEND_NAME -g $RG /dev/null; thenaz containerapp show --name $FRONTEND_NAME -g $RG \--query properties.configuration.ingress.customDomains \-o json /tmp/domains.jsonfipostprovision:shell: shrun: |# Verify/restore custom domainsif [ -f /tmp/domains.json ]; thenecho Saved domains: $(cat /tmp/domains.json)fi容器应用服务发现同一环境中Container Apps之间的内部HTTP路由// Backend reference in frontend env varsenv: [{name: BACKEND_URLvalue: http://ca-backend-${resourceToken} // Internal DNS}]前端nginx代理到内部URLlocation /api { proxy_pass $BACKEND_URL; }托管标识和RBAC启用系统分配标识resource containerApp Microsoft.App/containerApps2024-03-01 {identity: {type: SystemAssigned}}output principalId string containerApp.identity.principalId部署后RBAC分配hooks:postprovision:shell: shrun: |PRINCIPAL_ID${BACKEND_PRINCIPAL_ID}# Azure OpenAI accessaz role assignment create \--assignee-object-id $PRINCIPAL_ID \--assignee-principal-type ServicePrincipal \--role Cognitive Services OpenAI User \--scope $OPENAI_RESOURCE_ID 2/dev/null || true# Azure AI Search accessaz role assignment create \--assignee-object-id $PRINCIPAL_ID \--role Search Index Data Reader \--scope $SEARCH_RESOURCE_ID 2/dev/null || true常用命令命令描述azd env list列出所有环境azd env select name切换环境azd env get-values显示所有环境变量azd env set KEY value设置变量azd up完整配置 部署azd provision仅基础设施azd deploy仅代码部署azd deploy --service backend部署单个服务azd show显示项目状态关键提醒始终使用remoteBuild: true- 本地构建在M1/ARM Mac部署到AMD64时会失败Bicep输出自动填充.azure/env/.env- 不要手动编辑使用azd env set设置机密- 不要在main.parameters.json默认值中设置服务标签azd-service-name- azd查找Container Apps所需钩子中使用|| true- 防止RBAC已存在错误导致部署失败最佳实践为每个环境dev、staging、prod使用单独的azd环境将azure.yaml和基础设施文件提交到版本控制使用托管标识而不是连接字符串在钩子中实现健康检查使用azd管道配置设置CI/CD在Bicep模块中记录所需权限