Azure 开发人员 CLI (azd
) 使用环境变量来存储和管理部署环境的配置设置。 这些变量控制如何在 Azure 中预配、部署和运行应用程序。 本文介绍环境变量在 azd
环境中的工作原理,并提供有效管理它们的指南。
了解环境变量
在 Azure 开发人员 CLI 的上下文中,环境变量是绑定到特定命名环境(如 开发、 测试或 prod)的键值对。每个 azd
环境都维护自己的一组环境变量,使你可以为不同的部署目标配置不同的设置。
环境变量 azd
存储在位于 .azure
文件夹中的 .env
文件中。 它们作为输入:
- 应用程序部署工作流
- Azure 服务和连接的配置
- 通过 Bicep 和 Terraform 进行基础结构预配
与传统在作系统级别存在的环境变量不同, azd
环境变量的范围限定为项目中的特定环境,从而在不同的部署目标之间提供隔离。
环境变量在使用azd
时提供了几个关键优势:
- 环境隔离:使开发、测试和生产配置保持独立且不同。
- 配置一致性:确保所有团队成员对特定环境使用相同的设置。
- 基础结构即代码:通过变量而不是硬编码值定义基础结构参数化。
- 部署自动化:允许 CI/CD 管道使用相同的代码库但不同的配置部署到不同的环境。
- 简化的管理:从中心位置轻松更新环境中所有服务的设置。
每个 azd
环境都有自己的变量集,允许在使用相同的应用程序代码和基础结构模板时使用特定于环境的配置。
环境变量和 .env 文件
azd
环境变量存储在项目中特定于环境的目录中的.env
文件中。 使用 azd env new <name>
创建环境时,将创建目录结构:
.azure/
├── <environment-name>/
│ ├── .env # Environment variables for this environment
该文件 .env
使用标准格式,其中每行表示键值对:
KEY1=value1
KEY2=value2
小窍门
有关环境的详细信息,请访问“使用环境”一文。
当您运行命令如 azd up
时,azd
会自动从所选环境的 .env
文件中加载变量。
这些变量会影响:
-
基础设施配置:变量,例如
AZURE_LOCATION
和AZURE_SUBSCRIPTION_ID
,决定资源的创建位置和方式。 - 部署:服务终结点等变量控制应用程序如何连接到 Azure 服务。
- 应用程序配置:变量可以传递给应用程序配置来控制其行为。
-
资源命名:变量(如
AZURE_RESOURCE_GROUP
影响资源命名模式)。
文件 .env
还会在执行azd
操作,如azd init
、azd provision
以及azd deploy
时自动更新,捕获基础设施模板的输出,并将其存储以备将来使用。
设置环境变量。
可以使用不同的方法来设置 azd
环境变量,具体取决于方案。
使用 CLI 命令
设置环境变量的建议方法是使用 azd env set
命令,其中包括检查以确保有效值:
azd env set <key> <value>
例如,若要为应用程序设置配置值,请执行以下作:
azd env set API_TIMEOUT 5000
该命令在当前所选环境的文件中添加或更新变量 .env
。 还可以使用 --environment
标志以特定环境为目标:
azd env set API_TIMEOUT 5000 --environment prod
若要验证是否已正确设置环境变量,请执行以下作:
azd env get-value API_TIMEOUT
Bicep 的输出
其强大的功能 azd
是能够将 Bicep 基础结构模板中的输出参数自动捕获为环境变量。 例如,在文件中定义输出参数 main.bicep
时:
output API_ENDPOINT string = apiService.outputs.SERVICE_ENDPOINT_URL
运行 azd provision
后,此输出会自动保存到环境 .env
的文件:
API_ENDPOINT=https://api-dev-123456.azurewebsites.net
此方法可确保应用程序始终有权访问最新的资源信息,例如:
- 服务终结点和 URL
- 资源名称和标识符
获取和使用环境变量
设置后,可以在多个上下文中访问环境变量。
CLI 命令
若要查看当前环境的所有环境变量,请执行以下作:
azd env get-values
查看特定变量的值:
azd env get-value API_ENDPOINT
对于计算机可读输出(在脚本中很有用):
azd env get-values --output json
在基础结构文件中使用环境变量
可以使用环境变量自定义基础结构模板。 这对于基于当前环境命名、标记或配置资源非常有用。
azd
还使用标记在 Azure 中查找资源以执行部署和其他任务。
请考虑以下常见流:
在此期间
azd init
,azd
根据用户对提示的响应设置这些环境变量:AZURE_ENV_NAME=myapp-dev AZURE_LOCATION=eastus2
在
infra
文件夹中引用这些变量main.parameters.json
。azd
在预配过程中替换值,并将解析的参数传递给 Bicep:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "name": { "value": "${AZURE_ENV_NAME}" }, "location": { "value": "${AZURE_LOCATION}" } } }
在 Bicep 模板中定义匹配参数:
@description('Name of the environment used to derive resource names and tags.') param name string @minLength(1) @description('Primary Azure region for all resources.') param location string
azd
提供带有已替换值的 Bicep 参数,并在main.parameters.json
中使用它们。使用资源命名的参数和标记,以便稍后确定资源所属的环境:
var resourceToken = toLower(uniqueString(resourceGroup().id, name, location)) resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = { name: 'st${resourceToken}' location: location sku: { name: 'Standard_LRS' } kind: 'StorageV2' tags: { Environment: name Project: 'myproject' } }
此模式使模板保持灵活,在不更改代码的情况下启用按环境自定义,并改进资源治理(命名、标记和发现)。
注释
azd
还依赖于标记在部署阶段查找 Azure 资源。
挂钩
azd
环境变量会自动预加载,并在文件中定义的azure.yaml
和自定义脚本中可用,可以使用以下语法访问环境变量:
# Use the variables in your script
echo "API endpoint: $API_ENDPOINT"
echo "Deploying to: $AZURE_LOCATION"
可以在azure.yaml
文件中定义挂钩,以在azd
生命周期的特定点运行这些脚本:
hooks:
postprovision:
windows:
shell: pwsh
run: ./scripts/load-env-vars.ps1
interactive: false
posix:
shell: sh
run: ./scripts/load-env-vars.sh
interactive: false
小窍门
有关使用挂钩的详细信息,请访问“ 使用挂钩自定义工作流 ”一文。
删除或更新变量
若要从环境中删除变量,请执行以下作:
azd env unset VARIABLE_NAME
若要更新现有变量,请执行以下作:
azd env set VARIABLE_NAME "new-value"
若要从 Azure 资源的当前状态刷新本地环境变量,请执行以下作:
azd env refresh
刷新环境在以下情况下非常有用:
- 你希望确保本地
.env
文件反映基础结构的最新输出(如连接字符串、终结点等)。 - 在团队成员更新环境后,需要同步环境变量。
AZD 与 OS 环境变量
azd
环境变量和作系统环境变量有不同的用途,以不同的方式工作:
概念 | Azure Developer CLI | 操作系统 |
---|---|---|
位置 | 存储在 .azure/<env-name>/.env 文件中 |
在操作系统环境中进行配置 |
Scope | 范围限定为项目中的特定命名环境 | 适用于您的全局用户会话或系统 |
管理 | 使用 azd env 命令进行管理 |
使用特定于 OS 的命令(export set 等)进行管理 |
Access | 通过 azd 命令自动加载 |
通常在脚本或应用程序中显式加载 |
Target | 绑定到 Azure 资源和部署 | 常规用途系统配置 |
生命周期 | 在终端会话之间保持数据持久性 | 可能为临时或永久性,具体取决于设置方式 |
azd
不会自动读取或写入 OS 环境变量。 但是,可以使用自定义脚本与这两种类型的变量进行交互。
读取 azd
环境变量和 OS 环境变量:
# Access OS environment variable
echo "OS variable: $PATH"
# Access azd environment variable
echo "AZD variable: $(azd env get-value MY_VARIABLE)"
将环境变量写入 azd
OS 或框架环境变量:
# Load all azd environment variables into the current shell session
while IFS='=' read -r key value; do
value=$(echo "$value" | sed 's/^"//' | sed 's/"$//')
export "$key=$value"
done <<EOF
$(azd env get-values)
EOF
标准环境变量
azd
设置和使用所有环境中的多个常见环境变量:
Variable | 说明 | Example | 设置时 |
---|---|---|---|
AZURE_ENV_NAME |
当前环境的名称 | dev |
创建环境时 |
AZURE_LOCATION |
部署资源的 Azure 区域 | eastus |
在第一次预配期间 |
AZURE_SUBSCRIPTION_ID |
使用的 Azure 订阅的 ID | 00000000-0000-0000-0000-000000000000 |
在第一次预配期间 |
AZURE_RESOURCE_GROUP |
资源组的名称 | rg-myapp-dev |
预配期间 |
AZURE_PRINCIPAL_ID |
正在运行的用户/服务主体 ID | 00000000-0000-0000-0000-000000000000 |
预配期间 |
AZURE_PRINCIPAL_TYPE |
环境中的主体类型。 | 1a2b3c |
预配期间 |
AZURE_TENANT_ID |
环境中的主体类型。 | 1a2b3c |
预配期间 |
机密和敏感数据注意事项
虽然环境变量便于配置,但它们需要对敏感数据进行特殊处理:
避免在 .env 文件中存储机密
.env
文件通常以纯文本形式存储,并且可以轻松:
- 意外提交到版本控制系统
- 在没有适当的保护的情况下共享或复制
- 任何有权访问项目文件的人都可以查看
- 包含在日志或错误报告中
警告
切勿将机密存储在 Azure 开发人员 CLI .env
文件中。 这些文件可以轻松地被共享或复制到未经授权的位置,也可能被签入未经授权的源代码管理系统。 将 Azure Key Vault 或 Azure 基于角色的访问控制(RBAC)等服务用于受保护或无机密的解决方案。
处理机密的替代方法
对于敏感数据,请考虑以下更安全的方法:
Azure Key Vault 参考:将机密存储在 Azure Key Vault 中,然后在
.env
文件中引用它们。azd env set-secret <secret-value>
此命令创建一个 Key Vault 机密,并将对它的引用存储在你的
.env
文件中,而不是存储实际的值。托管标识:将 Azure 服务配置为使用托管标识,而不是连接字符串或访问密钥。
特定于环境的安全性:对生产环境应用比开发环境更严格的安全控制。
实时机密:在部署期间生成生存期较短的凭据,而不是存储持久性机密。