1. 项目概述:这不是又一个 Azure CLI,而是专为 AI 应用而生的“部署流水线加速器”
“Azure/azure-dev:微软官方的 AI 应用部署开发 CLI”——这个标题里藏着三个被绝大多数人忽略的关键信号。第一,“azure-dev”不是“az”(Azure CLI 的缩写),它是一个全新独立的工具链,代号azd;第二,“AI 应用部署开发”不是泛泛而谈的“云上跑模型”,而是直指当前最痛的环节:从本地调试好的 LangChain 或 LlamaIndex 项目,到真正能在 Azure 上稳定提供 API 服务、带监控告警、能自动扩缩容的生产环境,中间那条布满坑的“最后一公里”;第三,“微软官方”意味着它不是社区玩具,而是深度集成 Azure Resource Manager(ARM)、Bicep、Container Registry、App Service 和 AKS 的“原生级”工具,背后是微软云平台工程团队在真实客户项目中踩了上千次坑后沉淀下来的标准化路径。
我第一次在客户现场看到azd是在帮一家金融风控公司做 RAG 系统上线。他们用 Python 写好了整个检索增强流程,本地跑得飞起,但一上 Azure 就卡在三件事上:一是 Docker 镜像推送到 ACR 后,App Service 总是拉取失败,报错信息全是“unauthorized”;二是想加个 Application Insights 监控,手动改 ARM 模板改到怀疑人生,最后发现漏了一个dependsOn关系;三是测试环境和生产环境配置硬编码在代码里,每次切换都要改七八个文件。当时他们用的是纯az cli+ 手动脚本,整个部署流程耗时 4 小时,失败率 60%。我们换成azd后,azd up一条命令,22 分钟完成从零创建资源组、网络、ACR、App Service、Application Insights 到部署应用、验证健康检查的全流程,失败率为 0。这不是玄学,是azd把这些“必须做但又极其容易出错”的事,全部封装进了模板和命令里。
所以,azd的核心价值,绝不是“又一个命令行工具”。它是把 Azure 上部署 AI 应用的“最佳实践”变成了可执行、可复现、可审计的代码。它解决的不是“能不能部署”,而是“能不能在 30 分钟内,让一个刚毕业的实习生,把一个 Jupyter Notebook 里的 PoC,变成一个客户能直接调用的、带 SLA 保障的 API 服务”。关键词Azure、azure-dev、CLI、AI、微软,每一个都指向一个明确的场景:你手头有一个基于 Python/TypeScript 的 AI 应用(可能是聊天机器人、文档摘要、智能客服后端),你需要把它快速、可靠、符合企业安全规范地搬到 Azure 上。它不面向基础设施工程师,而是面向 AI 工程师、MLOps 工程师、甚至是有一定 Python 基础的数据科学家。如果你还在用az group create一条条敲命令,或者用 Terraform 自己写一堆模块来管理一个简单的 Flask API,那你真的该看看azd了——它不是替代你,而是把你从重复劳动里解放出来,让你专注在模型优化和业务逻辑上。
2. 核心设计思路拆解:为什么azd不是az的子集,而是一次范式升级
理解azd的设计哲学,是避免把它用成“高级版az”的关键。很多人第一次接触azd,会下意识地把它当成az的一个插件,比如az extension add --name azure-dev,然后期待azd命令能无缝嵌入到现有的az工作流里。这是个危险的误区。azd的底层架构,从第一天起就和az走了完全不同的路。az是一个“云资源操作器”,它的原子单位是“资源”(Resource):一个 VM、一个 Storage Account、一个 SQL Database。而azd的原子单位是“应用”(Application):一个由代码、配置、依赖服务共同构成的、有明确生命周期的软件实体。这个根本差异,决定了它们的设计目标、使用方式和适用场景。
2.1 “应用即代码”:模板驱动的声明式部署
azd的灵魂是模板(Template)。当你运行azd init,它不会问你“要创建几个 VM?磁盘多大?”,而是问你“你想部署什么类型的应用?Web API?容器化服务?Serverless 函数?”。然后它会根据你的选择,从官方模板库(https://github.com/Azure-Samples/azure-dev-cli-samples)中拉取一个完整的、经过验证的模板。这个模板不是一个空壳,而是一个包含所有必要文件的完整目录:
main.bicep:定义了所有 Azure 资源的 Bicep 代码,包括网络、存储、计算、监控等。app.yaml:定义了应用本身的部署配置,比如 Dockerfile 路径、环境变量、启动命令。.azd/config.json:azd工具自身的配置,记录了你选择的环境(dev/staging/prod)、订阅 ID、资源组名等元数据。README.md:详细的本地开发、测试、部署指南。
这个设计的精妙之处在于,它把“部署”这件事,从“一系列操作步骤”变成了“一个可版本控制的代码仓库”。你不需要记住az network vnet create的 17 个参数,你只需要看懂main.bicep里的一段声明式代码:
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = { name: appServicePlanName location: location sku: { name: 'B1' tier: 'Basic' } }这比任何命令行参数都更清晰、更易维护、更易审计。更重要的是,它天然支持 GitOps。你可以把整个azd项目推到 GitHub,然后用 GitHub Actions 触发azd up,实现真正的 CI/CD。而az命令,本质上还是一个“手动执行的脚本”,很难做到这种级别的自动化和可追溯性。
2.2 “开箱即用”的开发者体验:从azd init到azd up的极简路径
azd的另一个颠覆性设计,是它把“本地开发”和“云端部署”彻底打通了。传统方式下,你在本地用flask run启动一个服务,测试没问题后,再切到az命令去创建资源,再写 Dockerfile,再构建镜像,再推送,再部署……每一步都可能出错,每一步都需要不同的知识。azd用一个叫“开发容器”(Dev Container)的功能,把这个链条砍掉了一半。
当你在 VS Code 中打开一个azd项目,并点击“Reopen in Container”,VS Code 会根据项目根目录下的.devcontainer/devcontainer.json文件,自动拉起一个预装了所有依赖(Python、Node.js、Docker CLI、Bicep CLI、甚至azd本身)的 Docker 容器。在这个容器里,你运行azd dev up,它会:
- 在容器内本地构建你的应用镜像;
- 启动一个轻量级的模拟 Azure 环境(基于
azd内置的模拟器); - 将你的应用部署到这个模拟环境中,并暴露本地端口供你调试。
这意味着,你所有的开发、调试、单元测试,都可以在一个与最终生产环境高度一致的隔离环境中完成。你不再需要在本地装一堆 Azure SDK,也不需要为了测试一个 API 调用而去申请一个真实的 Azure 订阅。azd dev up运行成功,azd up基本就不会失败。这种“所见即所得”的体验,是az命令永远无法提供的,因为它不关心你的“应用”,只关心你的“资源”。
2.3 “安全左移”的默认策略:企业级合规的隐形守护者
对于金融、医疗等强监管行业的客户,azd的一个隐藏价值是它内置的“安全左移”(Shift-Left Security)能力。azd的所有官方模板,默认就遵循了 Azure Well-Architected Framework 的最佳实践。例如:
- 网络隔离:所有模板默认创建一个专用的虚拟网络(VNet),并启用服务端点(Service Endpoints)或私有链接(Private Link),确保数据库、存储等敏感服务不暴露在公网上。
- 密钥管理:所有密码、API Key、连接字符串,都会被自动注入到 Azure Key Vault,并通过托管标识(Managed Identity)进行访问,杜绝了在代码或配置文件中硬编码密钥的风险。
- 日志与监控:Application Insights 和 Log Analytics 工作区是模板的标配组件,所有 HTTP 请求、异常、性能指标都会被自动采集,无需额外配置。
你不需要成为 Azure 安全专家,就能获得一个符合企业安全基线的部署方案。而如果你用az命令自己搭建,这些安全配置项往往就是最容易被忽略、也最容易出问题的地方。azd把这些“应该做但常常不做”的事情,变成了“不做反而很难”的默认行为。这就是微软官方工具和社区工具的本质区别:前者承载的是平台的治理意图,后者承载的是用户的自由意志。
3. 核心细节与实操要点:安装、验证与避坑指南
azd的安装看似简单,但背后有大量容易被忽视的细节和陷阱。我见过太多人卡在第一步,不是因为命令错了,而是因为没搞懂azd对系统环境的隐含要求。下面我将结合 Windows、macOS 和 Linux 三大平台,把每个安装渠道的原理、适用场景和致命坑点,掰开揉碎讲清楚。
3.1 安装渠道选择:没有“最好”,只有“最适合”
azd提供了至少 6 种安装方式,但它们并非平权。选择哪种方式,取决于你的角色、工作流和长期维护成本。
| 安装方式 | 适用人群 | 核心优势 | 致命缺陷 | 我的建议 |
|---|---|---|---|---|
winget install microsoft.azd(Windows) | 企业 IT 管理员、普通开发者 | 一键安装,自动处理 PATH,与 Windows Update 集成,更新方便 | 仅限 x64 架构,Arm64 支持处于 Alpha 阶段,且winget本身在某些企业域环境下被禁用 | 如果你是 Win10/Win11 用户,且公司没禁winget,这是首选。它最省心。 |
brew install azure/azd/azd(macOS) | macOS 开发者、技术爱好者 | Homebrew 生态成熟,依赖管理完善,brew upgrade一键更新 | 需要先安装 Rosetta 2(M1/M2 Mac),否则azd会因架构不匹配而崩溃 | M1/M2 Mac 必须先运行softwareupdate --install-rosetta,否则azd version会直接报Killed: 9。这是血泪教训。 |
curl -fsSL https://aka.ms/install-azd.sh | bash(Linux/macOS) | DevOps 工程师、CI/CD 流水线 | 最灵活,可嵌入 Shell 脚本,适合自动化部署 | 脚本会修改~/.bashrc或~/.zshrc,如果 shell 配置复杂,可能导致 PATH 冲突 | 在 Jenkins 或 GitHub Actions 中,这是唯一推荐的方式。但务必在脚本末尾加source ~/.bashrc确保环境生效。 |
| MSI 安装包 (Windows) | 需要离线安装、或winget不可用的用户 | 完全离线,图形化向导,适合给非技术人员安装 | 升级困难,卸载不干净,旧版本 MSI 可能与新版本冲突 | 仅作为备选。一旦用 MSI 安装,后续务必用winget或脚本升级,不要混用。 |
| GitHub Release ZIP (All) | Arm64 架构探索者、早期尝鲜者 | 提供最新的 Arm64 alpha 版本 | 需要手动解压、配置 PATH、管理更新,对新手极不友好 | 除非你明确知道自己在做什么(比如在 Surface Pro X 上跑azd),否则别碰。 |
提示:
azd的安装过程会自动安装其依赖工具,包括Bicep CLI、Git CLI(Linux/macOS)或GitHub CLI(Windows)。这是一个双刃剑:好处是省去了你手动安装的麻烦;坏处是,如果你的系统里已经存在一个老版本的Bicep,azd安装的版本可能会覆盖它,导致你其他项目里的 Bicep 模板编译失败。我的经验是,在安装azd前,先运行bicep --version和git --version,记下当前版本。如果azd安装后出现问题,可以单独用npm install -g @azure/bicep或git的包管理器重新安装回你想要的版本。
3.2 验证安装:azd version之后的三步必检清单
仅仅运行azd version并看到输出,不代表安装成功。azd是一个“组合拳”工具,它需要多个组件协同工作。我总结了一个三步验证清单,缺一不可:
azd version的输出必须包含commit hash
正确的输出类似:azd version 1.9.5 (commit cd2b7af9995d358aab33c782614f801ac1997dde)。如果只显示azd version 1.9.5,没有括号里的 commit,说明你安装的是一个“阉割版”或损坏的二进制文件。这通常发生在用错误的curl命令下载了 HTML 页面而不是二进制文件时。解决方案:重新运行安装命令,或直接从 GitHub Releases 页面下载对应平台的.zip或.deb文件。azd login必须能成功获取 Token
运行azd login,它会自动打开浏览器,引导你登录 Azure 账户。登录成功后,终端会显示You have successfully logged in.。关键点来了:此时,azd会将你的登录凭证缓存到~/.azd/credentials(Linux/macOS)或%USERPROFILE%\.azd\credentials(Windows)。请手动打开这个文件,确认里面是一个有效的 JSON,且accessToken字段不为空。如果这个文件是空的,或者accessToken是null,说明azd的身份认证模块出了问题。常见原因:系统时间不准确(误差超过 5 分钟)、企业防火墙拦截了login.microsoftonline.com的请求、或者你登录的是一个没有 Azure 订阅的 Microsoft 账户(比如纯 Outlook 账户)。解决方案:校准系统时间,换一个有订阅的账户,或在企业网络中联系 IT 部门放行相关域名。azd list必须能列出你的 Azure 订阅
运行azd list,它会列出你账户下所有可用的 Azure 订阅。如果这里报错No subscriptions found,不要慌。这通常不是azd的问题,而是你的 Azure 账户权限问题。azd默认只会列出你拥有Reader或更高权限的订阅。如果你是刚注册的免费账户,或者你的账户是通过 Azure AD B2B 被邀请进来的,你可能没有被显式授予任何订阅的访问权限。解决方案:登录 Azure Portal ,进入“所有资源” -> “订阅”,找到你的订阅,点击“访问控制 (IAM)”,然后为你自己添加一个Contributor角色。添加后,等待 2-3 分钟,再运行azd list,订阅就会出现了。
注意:
azd的登录状态和az login的状态是完全独立的。你可以在同一台机器上,用az login登录一个账户,用azd login登录另一个账户。它们互不影响。这也是为什么azd的文档里反复强调,不要用az login来代替azd login。
3.3 实操中的“魔鬼细节”:那些文档里不会写的坑
除了安装和验证,azd在日常使用中还有几个高频、隐蔽、且让人抓狂的细节问题,我在这里一次性说透:
azd up失败后,如何干净地“回滚”?azd up是一个原子操作,但它不是事务性的。如果中途失败(比如网络中断、配额不足),它可能会留下一个“半成品”的资源组。azd down命令理论上可以清理,但实测中,它有时会因为资源依赖关系复杂而失败。最稳妥的方法是:先用azd list找到你这次部署对应的资源组名(通常是rg-<project-name>-<env>),然后直接用az group delete --name <resource-group-name> --yes强制删除。az命令的删除是幂等的,即使资源组不存在,也不会报错。如何在
azd项目中使用私有 Git 仓库?azd init默认会从 GitHub 的公开模板库拉取。如果你想基于公司内部的 GitLab 或 Azure Repos 创建模板,azd本身不支持直接指定私有 URL。解决方案是:先用azd init初始化一个基础项目,然后手动编辑.azd/config.json文件,将"template"字段的值,从"https://github.com/Azure-Samples/..."改为你公司仓库的 SSH 或 HTTPS 地址。注意,如果是 HTTPS 地址,你需要提前配置好 Git 的凭据管理器(Credential Manager),否则azd在拉取时会卡住。azd的环境变量,为什么在app.yaml里设置不生效?
这是个经典误区。app.yaml里的environmentVariables是给azd的部署引擎看的,用于在部署过程中注入到 Bicep 模板里。而你的应用(比如一个 Python Flask 服务)要读取的环境变量,必须在Dockerfile的ENV指令里声明,或者在azd的app.yaml的service部分,通过environmentVariables子字段来设置。正确的写法是:services: api: project: ./src/api language: python environmentVariables: - name: DATABASE_URL value: "https://mydb.database.windows.net" - name: OPENAI_API_KEY value: "@Microsoft.KeyVault(SecretUri=https://mykv.vault.azure.net/secrets/openai-key/)"注意最后一行,
@Microsoft.KeyVault(...)是 Azure 的密钥引用语法,azd会自动将其解析为 Key Vault 中的实际值。
4. 实操过程详解:从零开始,用azd部署一个 LangChain 聊天机器人
现在,让我们把前面所有的理论和细节,放到一个真实的、有血有肉的项目中来演练。我们将部署一个基于 LangChain 的、能回答你 PDF 文档内容的聊天机器人。这个项目完美契合azd的设计初衷:它是一个典型的 AI 应用,有前端(Streamlit UI)、后端(FastAPI API)、向量数据库(Azure Cognitive Search)、以及外部模型服务(Azure OpenAI)。整个流程,我们将严格遵循azd的标准工作流,不走任何捷径。
4.1 项目初始化与模板选择
首先,创建一个空目录,并进入它:
mkdir langchain-rag-bot && cd langchain-rag-bot然后,运行azd init。它会启动一个交互式向导:
? What would you like to do? (Use arrow keys) ❯ Create a new application from a template Use an existing application选择第一个选项。接着,它会列出所有官方模板:
? Select a template (Use arrow keys) ❯ Web App (Python) Web App (TypeScript) Container App (Python) Container App (TypeScript) Function App (Python) Function App (TypeScript) ...这里,不要选“Web App (Python)”。虽然它看起来最接近,但它是一个通用的 Flask 应用模板,缺少对 AI 应用特有的依赖(如langchain、azure-search-documents)和配置。我们应该选择“Container App (Python)”。因为我们的 LangChain 项目,最终一定会打包成 Docker 容器来部署,以保证环境一致性。
选择后,azd会询问项目名称(默认是目录名langchain-rag-bot)和环境(默认dev)。一路回车即可。完成后,你的目录结构会是这样的:
langchain-rag-bot/ ├── .azd/ │ └── config.json ├── main.bicep ├── app.yaml ├── README.md └── src/ └── app/ ├── Dockerfile ├── requirements.txt └── app.py4.2 代码开发:构建一个最小可行的 LangChain 应用
现在,我们来填充src/app/目录。我们的目标是:一个 FastAPI 服务,接收一个 PDF 文件和一个问题,返回答案。
编写
requirements.txt
这是azd构建 Docker 镜像时的依赖清单。我们需要添加 LangChain 和 Azure 相关的 SDK:fastapi==0.111.0 uvicorn==0.29.0 langchain==0.1.18 langchain-community==0.0.35 azure-search-documents==11.4.0b10 openai==1.30.4 python-dotenv==1.0.0编写
Dockerfileazd的模板已经为我们生成了一个基础的Dockerfile,我们只需微调:# syntax=docker/dockerfile:1 FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 这里是关键!告诉 azd,这个容器监听 8000 端口 EXPOSE 8000 CMD ["uvicorn", "app:app", "--host", "0.0.0.0:8000", "--port", "8000"]编写
app.py
这是应用的核心逻辑。为了演示,我们先写一个“假”的、但结构完整的骨架:from fastapi import FastAPI, UploadFile, File, Form from fastapi.responses import JSONResponse import os from dotenv import load_dotenv # 加载环境变量,azd 会自动注入 .env 文件 load_dotenv() app = FastAPI(title="LangChain RAG Bot") @app.post("/ask") async def ask_question( file: UploadFile = File(...), question: str = Form(...) ): # TODO: 这里将实现 PDF 解析、向量化、检索和回答的完整逻辑 # 当前,我们只返回一个占位符响应 return JSONResponse({ "answer": f"Hello! You asked: '{question}'. I've received your file '{file.filename}' and will process it shortly.", "sources": [] }) @app.get("/health") def health_check(): return {"status": "ok"}注意
/health这个端点。azd在部署时,会自动为 App Service 配置健康探针(Health Probe),它会定期调用这个端点来判断你的应用是否存活。如果你不提供这个端点,azd up可能会成功,但你的应用在 Azure 上会一直处于“未就绪”状态。
4.3 配置app.yaml:将 AI 应用与 Azure 服务绑定
app.yaml是azd的“大脑”,它告诉azd如何将你的代码和 Azure 的云服务连接起来。我们需要在这里声明对 Azure OpenAI 和 Azure Cognitive Search 的依赖。
打开app.yaml,找到services部分。默认只有一个api服务。我们需要为它添加两个resources:
services: api: project: ./src/app language: python # ... 其他默认配置保持不变 ... # 新增:声明对 Azure OpenAI 的依赖 resources: - name: openai type: azure-openai properties: sku: S0 model: gpt-35-turbo embeddingModel: text-embedding-ada-002 # 新增:声明对 Azure Cognitive Search 的依赖 - name: search type: azure-search properties: sku: basic这段配置的含义是:azd在运行azd up时,不仅会创建 App Service 来部署你的api服务,还会自动创建一个azure-openai资源和一个azure-search资源,并将它们的连接字符串、密钥等信息,以环境变量的形式注入到你的api容器中。你不需要在代码里硬编码任何 Azure 的 endpoint 或 key,azd会帮你搞定一切。
4.4 部署与验证:azd up的完整流程
一切准备就绪,现在是见证奇迹的时刻。在项目根目录下,运行:
azd upazd会开始一个漫长的、但极其透明的过程:
Provisioning Azure Resources...:azd会解析main.bicep和app.yaml,生成一个完整的 ARM 模板,然后调用 Azure REST API 创建所有资源。这个阶段,你会看到实时的日志,告诉你正在创建哪个资源,以及它的状态(Succeeded/Failed)。Building and Pushing Container Image...:azd会在本地构建你的Dockerfile,然后将镜像推送到项目专属的 Azure Container Registry(ACR)。Deploying Application...:azd会将 ACR 中的镜像,部署到刚刚创建的 App Service 实例上。Validating Deployment...:azd会调用你app.py里的/health端点,进行健康检查。如果检查失败,它会立即停止并报错。
如果一切顺利,最后你会看到:
✅ Successfully deployed application. Your application is now available at: https://langchain-rag-bot-dev.azurewebsites.net打开这个 URL,你应该能看到一个空白页面(因为我们还没写前端),但这已经证明后端服务已经成功运行。你可以用curl测试一下:
curl -X POST "https://langchain-rag-bot-dev.azurewebsites.net/ask" \ -H "Content-Type: multipart/form-data" \ -F "file=@test.pdf" \ -F "question=What is the main topic?"4.5 迭代开发:azd deploy与azd dev up的协同
在实际开发中,你不可能每次都azd up。那太慢了。azd提供了两种高效的迭代方式:
azd deploy:当你只修改了代码(app.py,requirements.txt),而没有修改基础设施(main.bicep)或服务依赖(app.yaml)时,用这个命令。它会跳过资源创建阶段,只执行“构建镜像 -> 推送 -> 部署”这三步,速度比azd up快 3-5 倍。azd dev up:当你想在本地进行快速调试,不想每次改一行代码都推送到云端时,用这个命令。它会启动一个本地的 Docker 容器,并模拟 Azure 的环境(比如,它会创建一个本地的 SQLite 数据库来模拟 Azure Search)。你可以在http://localhost:3000直接访问你的应用,所有日志都会实时打印在终端里。这是azd最体现“开发者体验”的功能。
5. 常见问题与排查技巧实录:来自一线战场的 12 个真实案例
azd的文档很完善,但文档永远无法覆盖所有现实世界的混乱。以下是我和团队在过去一年中,在数十个客户项目里,遇到并解决的 12 个最高频、最棘手的问题。每一个都附带了精准的定位方法和一击必杀的解决方案。
5.1 问题速查表
| 问题现象 | 根本原因 | 快速诊断命令 | 终极解决方案 |
|---|---|---|---|
azd up卡在Provisioning Azure Resources...,长时间无响应 | Azure 订阅配额不足(如 vCPU 数量已达上限) | az vm list-usage --location "East US" --query "[?localizedName=='Total Regional vCPUs'].currentValue" | 登录 Azure Portal,进入“订阅” -> “Usage + quotas”,申请提升配额。 |
azd login后,azd list显示No subscriptions found | 账户没有被授予任何订阅的Reader权限 | az account list --all --query "[].{name:name, id:id, state:state}" -o table | 在 Azure Portal 的订阅 IAM 设置中,为你自己添加Reader角色。 |
azd up成功,但访问应用 URL 返回503 Service Unavailable | App Service 的WEBSITES_ENABLE_APP_SERVICE_STORAGE设置为false,导致应用无法加载静态文件 | az webapp config appsettings list --name <app-name> --resource-group <rg-name> | 运行az webapp config appsettings set --name <app-name> --resource-group <rg-name> --settings WEBSITES_ENABLE_APP_SERVICE_STORAGE=true |
azd dev up启动后,http://localhost:3000无法访问 | 本地 Docker Desktop 未运行,或docker ps无任何容器 | docker info | 启动 Docker Desktop,并确保其状态为Running。 |
azd deploy报错The resource operation completed with terminal provisioning state 'Failed'. | main.bicep中的某个资源创建失败,但错误信息被azd层掩盖 | az deployment group show --name <deployment-name> --resource-group <rg-name> --query "properties.error" | 查看azd输出日志中最后几行的deployment-name,然后用上面的az命令获取原始 ARM 错误。 |
azd命令提示command not found,但which azd能找到路径 | azd的可执行文件路径不在系统的PATH环境变量中 | echo $PATH(Linux/macOS) orecho %PATH%(Windows) | 手动将azd的安装目录(如/home/user/.azd/bin)添加到PATH中,并重载 shell 配置。 |
azd up创建的 App Service,日志中看不到print()输出 | App Service 的日志级别默认为Error,print()属于Information级别 | az webapp log tail --name <app-name> --resource-group <rg-name> | 运行az webapp log config --name <app-name> --resource-group <rg-name> --application-logging true --level information |
azd项目中,requirements.txt里的包安装失败 | azd使用的 Python 版本与requirements.txt中的包不兼容(如pydantic2.x 需要 Python 3.8+) | cat src/app/Dockerfile | grep FROM | 修改Dockerfile,将FROM python:3.10-slim改为FROM python:3.11-slim。 |
azd部署的容器应用,启动后立即崩溃(CrashLoopBackOff) | Dockerfile中的CMD指令与app.yaml中的expose端口不匹配 | cat src/app/Dockerfile | grep CMDandcat app.yaml | grep expose | 确保CMD启动的服务监听的端口,与app.yaml中expose的端口完全一致(如都是8000)。 |
azd模板中,azure-openai资源创建失败,报错LocationNotAvailableForResourceType | 你选择的 Azure 区域(如West US)不支持azure-openai这个资源类型 | az provider show --namespace Microsoft.CognitiveServices --query "resourceTypes[?resourceType=='accounts'].locations" | 在app.yaml中,为azure-openai资源显式指定一个支持的区域,如location: "East US"。 |
azd部署后,应用无法访问 Azure Key Vault 中的密钥 | azd创建的 App Service 托管标识(Managed Identity)没有被授予 Key Vault 的Secret User权限 | az keyvault show --name <kv-name> --query "properties.accessPolicies" | 运行az keyvault set-policy --name <kv-name> --object-id <app-service-principal-id> --secret-permissions get。<app-service-principal-id>可以在 App Service 的“标识”设置页找到。 |
azd的azd update命令报错Error: failed to get latest version | azd的更新通道(channel |