你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
本文内容
Azure 部署环境 (ADE) 支持扩展性模型,使你能够使用偏好的 IaC 模板框架配置环境定义。 可以在容器注册表(例如 Azure 容器注册表 (ACR) 或 Docker Hub)中存储自定义映像,然后在环境定义中引用它们以部署环境。
本文介绍了如何生成自定义 Bicep 容器映像,以在 ADE 中部署环境定义。 了解如何使用 Microsoft 提供的标准映像,或者如何使用 Bicep 基础结构即代码 (IaC) 框架配置自定义映像预配基础结构。
本文介绍如何生成自定义 Terraform 容器映像,以使用 Azure 部署环境 (ADE) 创建部署环境。 了解如何配置自定义映像以使用 Terraform 基础结构即代码 (IaC) 框架来预配基础结构。
本文介绍如何利用 Pulumi 进行 ADE 中的部署。 了解如何使用 Pulumi 提供的标准映像,或者如何使用 Pulumi 基础结构即代码 (IaC) 框架配置自定义映像来预配基础结构。
先决条件
具有活动订阅的 Azure 帐户。 免费创建帐户 。
在 Azure 订阅中设置的 Azure 部署环境。
将容器映像与 ADE 配合使用
可以采用以下方法之一将容器映像与 ADE 配合使用:
使用标准容器映像:对于简单场景,请使用 ADE 提供的标准 ARM-Bicep 容器映像。
创建自定义容器映像 :对于较复杂的场景,请创建满足特定要求的自定义容器映像。
使用标准容器映像
ADE 支持 Azure 资源管理器 (ARM) 和 Bicep,而无需任何额外的配置。 你可以通过将模板文件(例如 azuredeploy.json 和 environment.yaml )添加到目录来为部署环境创建用来部署 Azure 资源的环境定义。 然后,ADE 使用标准 ARM-Bicep 容器映像来创建部署环境。
在 environment.yaml 文件中,runner
属性指定要使用的容器映像的位置。 若要使用在 Microsoft 工件注册表上发布的标准映像,请使用相应的标识符 runner
。
以下示例演示了引用标准 ARM-Bicep 容器映像的 runner
:
name: WebApp
version: 1.0.0
summary: Azure Web App Environment
description: Deploys a web app in Azure without a datastore
runner: Bicep
templatePath: azuredeploy.json
可以在 ARM-Bicep 映像的 Runner-Images 文件夹 下的 ADE 标准存储库中看到标准 Bicep 容器映像。
有关如何创建使用 ADE 容器映像部署 Azure 资源的环境定义的详细信息,请参阅添加和配置环境定义 。
创建自定义容器映像
使用脚本创建自定义容器映像
通过创建自定义容器映像,可以自定义部署来满足你的要求。 你可以使用 Microsoft 提供的快速入门脚本基于 ADE 标准映像创建和生成映像,并将其推送到容器注册表。 你可以在部署环境存储库 中找到该脚本。 若要使用该快速入门脚本,请创建该存储库的分支,然后在本地运行该脚本。
该脚本将生成映像并将其推送到存储库“ade”下的指定 Azure 容器注册表 (ACR) 和标记“latest”。 此脚本要求提供自定义映像的注册表名称和目录,已在 PATH 变量中安装 Azure CLI 和 Docker Desktop,并要求你有权推送到指定的注册表。
若要使用该快速入门脚本快速生成此示例映像并将其推送到 Azure 容器注册表,需要:
在个人帐户中创建此存储库的分支。
确保 Azure CLI 和 Docker Desktop 应用程序已安装在你的计算机上并位于 PATH 变量中。
确保有权将映像推送到所选的 Azure 容器注册表。
可以在 PowerShell 中使用以下命令调用脚本:
.\quickstart-image-build.ps1 -Registry '{YOUR_REGISTRY}' -Directory '{DIRECTORY_TO_YOUR_IMAGE}'
此外,如果要推送到特定的存储库和标记名称,可以运行:
.\quickstart-image.build.ps1 -Registry '{YOUR_REGISTRY}' -Directory '{DIRECTORY_TO_YOUR_IMAGE}' -Repository '{YOUR_REPOSITORY}' -Tag '{YOUR_TAG}'
若要在环境部署中使用映像,需要将映像的位置添加到清单文件,将映像连接到环境定义 ,并且可能需要配置 ACR 的权限,以使自定义映像可用于 ADE 。
手动创建自定义容器映像
通过创建自定义容器映像,可以自定义部署来满足你的要求。 你可以基于 ADE 标准映像创建自定义映像。
完成映像自定义后,可以手动生成映像并将其推送到容器注册表。
你可以通过预安装在标准映像上的 ADE CLI 使用 ADE 标准映像作为基础来生成自定义映像。 若要详细了解 ADE CLI,请参阅 CLI 自定义运行程序映像参考 。
本示例介绍如何生成 Docker 映像来利用 ADE 部署并访问 ADE CLI,使你的映像基于 ADE 创作的映像之一。
要创建为 ADE 配置的映像,请执行以下步骤:
基于标准映像创建自定义映像。
安装所需的程序包。
配置操作 shell 脚本。
创建用于部署 ARM 或 Bicep 模板的操作 shell 脚本。
1.基于标准映像创建自定义映像
创建一个 DockerFile,在其中包括一个 FROM 语句,指向 Microsoft 工件注册表上托管的标准映像。
下面是引用标准核心映像的示例 FROM 语句:
FROM mcr.microsoft.com/deployment-environments/runners/core:latest
此语句拉取最近发布的核心映像,并使其成为你的自定义映像的基础。
2.安装所需的程序包
在此步骤中,你将在映像中安装所需的任何程序包,包括 Bicep。 可以使用 RUN 语句通过 Azure CLI 安装 Bicep 包,如以下示例所示:
RUN az bicep install
ADE 标准映像基于 Azure CLI 映像,并且预安装了 ADE CLI 和 JQ 包。 可以详细了解 Azure CLI 和 JQ 包 。
若要在映像中安装所需的任何其他包,请使用 RUN 语句。
3.配置操作 shell 脚本
在标准映像中,将根据操作名称来确定和执行操作。 目前,支持的两个操作名称是 deploy 和 delete 。
若要设置自定义映像以利用此结构,请在名为 scripts 的 Dockerfile 级别指定一个文件夹,然后指定两个文件 deploy.sh 和 delete.sh 。deploy shell 脚本在创建或重新部署环境时运行,delete shell 脚本在删除环境时运行。 可以在存储库中 ARM-Bicep 映像的 Runner-Images 文件夹 下查看 shell 脚本的示例。
若要确保这些 shell 脚本是可执行的,请将以下行添加到 Dockerfile:
COPY scripts/* /scripts/
RUN find /scripts/ -type f -iname "*.sh" -exec dos2unix '{}' '+'
RUN find /scripts/ -type f -iname "*.sh" -exec chmod +x {} \;
4.创建用于部署 ARM 或 Bicep 模板的操作 shell 脚本
若要确保可以通过 ADE 成功部署 ARM 或 Bicep 基础结构,必须:
将 ADE 参数转换为 ARM 可接受的参数
解决在部署中使用的链接模板
使用特权托管标识执行部署
在核心映像的入口点期间,为当前环境设置的任何参数都存储在变量 $ADE_OPERATION_PARAMETERS
下。 若要将它们转换为 ARM 可接受的参数,则可以使用 JQ 运行以下命令:
# format the parameters as arm parameters
deploymentParameters=$(echo "$ADE_OPERATION_PARAMETERS" | jq --compact-output '{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": (to_entries | if length == 0 then {} else (map( { (.key): { "value": .value } } ) | add) end) }' )
接下来,若要解析基于 ARM JSON 的模板中使用的任何链接模板,可以反编译主模板文件,该文件可解析用于许多 Bicep 模块的所有本地基础结构文件。 然后,将这些模块重新生成回单个 ARM 模板,并将链接模板作为嵌套模板嵌入到主 ARM 模板中。 此步骤仅在部署操作期间是必需的。 可以使用核心映像入口点期间设置的 $ADE_TEMPLATE_FILE
指定主模板文件,应使用重新编译的模板文件重置此变量。 请参阅以下示例:
if [[ $ADE_TEMPLATE_FILE == *.json ]]; then
hasRelativePath=$( cat $ADE_TEMPLATE_FILE | jq '[.. | objects | select(has("templateLink") and (.templateLink | has("relativePath")))] | any' )
if [ "$hasRelativePath" = "true" ]; then
echo "Resolving linked ARM templates"
bicepTemplate="${ADE_TEMPLATE_FILE/.json/.bicep}"
generatedTemplate="${ADE_TEMPLATE_FILE/.json/.generated.json}"
az bicep decompile --file "$ADE_TEMPLATE_FILE"
az bicep build --file "$bicepTemplate" --outfile "$generatedTemplate"
# Correctly reassign ADE_TEMPLATE_FILE without the $ prefix during assignment
ADE_TEMPLATE_FILE="$generatedTemplate"
fi
fi
若要提供部署在订阅中执行部署和删除资源所需的权限,请使用与 ADE 项目环境类型关联的特权托管标识。 如果部署需要特殊权限才能完成,例如特定角色,请将这些角色分配给项目环境类型的标识。 有时,在进入容器时,托管标识不会立即可用;你可以重试,直到登录成功。
echo "Signing into Azure using MSI"
while true; do
# managed identity isn't available immediately
# we need to do retry after a short nap
az login --identity --allow-no-subscriptions --only-show-errors --output none && {
echo "Successfully signed into Azure"
break
} || sleep 5
done
若要开始部署 ARM 或 Bicep 模板,请运行 az deployment group create
命令。 在容器中运行此命令时,请选择不替代任何过去部署的部署名称,并使用 --no-prompt true
和 --only-show-errors
标志来确保部署不会在出现任何警告或等待用户输入时停止,如以下示例所示:
deploymentName=$(date +"%Y-%m-%d-%H%M%S")
az deployment group create --subscription $ADE_SUBSCRIPTION_ID \
--resource-group "$ADE_RESOURCE_GROUP_NAME" \
--name "$deploymentName" \
--no-prompt true --no-wait \
--template-file "$ADE_TEMPLATE_FILE" \
--parameters "$deploymentParameters" \
--only-show-errors
若要删除环境,请执行完整模式部署并提供一个空 ARM 模板,该模板会移除指定 ADE 资源组中的所有资源,如以下示例所示:
deploymentName=$(date +"%Y-%m-%d-%H%M%S")
az deployment group create --resource-group "$ADE_RESOURCE_GROUP_NAME" \
--name "$deploymentName" \
--no-prompt true --no-wait --mode Complete \
--only-show-errors \
--template-file "$DIR/empty.json"
可以通过运行以下命令来检查预配状态和详细信息。 ADE 使用一些特殊函数根据预配的详细信息读取和提供其他上下文,你可以在运行程序映像 文件夹中找到这些详细信息。 一个简单的实现可能如下所示:
if [ $? -eq 0 ]; then # deployment successfully created
while true; do
sleep 1
ProvisioningState=$(az deployment group show --resource-group "$ADE_RESOURCE_GROUP_NAME" --name "$deploymentName" --query "properties.provisioningState" -o tsv)
ProvisioningDetails=$(az deployment operation group list --resource-group "$ADE_RESOURCE_GROUP_NAME" --name "$deploymentName")
echo "$ProvisioningDetails"
if [[ "CANCELED|FAILED|SUCCEEDED" == *"${ProvisioningState^^}"* ]]; then
echo -e "\nDeployment $deploymentName: $ProvisioningState"
if [[ "CANCELED|FAILED" == *"${ProvisioningState^^}"* ]]; then
exit 11
else
break
fi
fi
done
fi
最后,若要查看部署的输出并将其传递给 ADE,以便通过 Azure CLI 访问它们,可以运行以下命令:
deploymentOutput=$(az deployment group show -g "$ADE_RESOURCE_GROUP_NAME" -n "$deploymentName" --query properties.outputs)
if [ -z "$deploymentOutput" ]; then
deploymentOutput="{}"
fi
echo "{\"outputs\": $deploymentOutput}" > $ADE_OUTPUTS
生成自定义映像
你可以使用 Docker CLI 构建你的映像。 确保计算机上已安装 Docker 引擎 。 然后,导航到 Dockerfile 的目录并运行以下命令:
docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}
例如,如果要将映像保存在名为 customImage
的注册表中的存储库下,并使用 1.0.0
的标记版本进行上传,请运行:
docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0
将容器映像与 ADE 配合使用
可以采用以下方法之一将容器映像与 ADE 配合使用:
使用脚本创建自定义容器映像:使用已发布的脚本创建特定于 Terraform 的映像。
利用 GitHub 工作流创建自定义容器映像:使用“通过 Terraform 利用 ADE 的扩展性模型”存储库中的已发布 GitHub 工作流。
手动创建自定义容器映像:手动创建特定于 Terraform 的自定义映像
创建自定义容器映像
使用 GitHub 工作流创建自定义容器映像
首先,可以使用“通过 Terraform 利用 ADE 的扩展性模型”存储库中的已发布 GitHub 工作流。
若要使用该工作流,需要:
在个人帐户中创建此存储库的分支
允许 GitHub Actions 使用 Microsoft Entra ID 应用程序的联合凭据通过 OIDC 连接到 Azure。 你可在此处找到有关此过程的更多文档
为存储库设置存储库机密,其中包含 Microsoft Entra ID 应用程序的应用程序 ID(设置为 AZURE_CLIENT_ID)、订阅 ID(设置为 AZURE_SUBSCRIPTION_ID)和租户 ID(设置为AZURE_TENANT_ID)
为存储库设置存储库变量,其中包含个人 Azure 容器注册表 (ACR)(命名为 REGISTRY_NAME)、首选存储库名称(命名为REPOSITORY_NAME)和所创建映像的首选标记(命名为 TAG)。 你可以在工作流运行之间修改变量,以将生成的映像推送到不同的注册表、存储库和标记。
导航到分支存储库中的“操作”选项卡并选择要运行的工作流来运行工作流。 然后,可以选择“运行工作流”按钮来启动工作流。
若要在环境部署中使用映像,需要将映像的位置添加到清单文件,将映像连接到环境定义 ,并且可能需要配置 ACR 的权限,以使自定义映像可用于 ADE 。
手动创建自定义容器映像
通过创建自定义容器映像,可以自定义部署来满足你的要求。 你可以基于 ADE 标准映像创建自定义映像。
完成映像自定义后,你必须生成映像并将其推送到容器注册表。
你可以手动生成和推送映像,也可以使用 Microsoft 提供的脚本自动执行该过程。
已发布的 GitHub Action 有助于生成映像并将其推送到 Azure 容器注册表 (ACR)。 可以在 ADE 中的环境定义中引用提供的 ACR 映像链接,以部署或删除具有提供的映像的环境。
要创建为 ADE 配置的映像,请执行以下步骤:
基于 GitHub 工作流创建自定义映像。
安装所需的程序包。
配置操作 shell 脚本。
创建使用 Terraform CLI 的操作 shell 脚本。
1.基于 GitHub 工作流创建自定义映像
使用已发布的存储库 来利用 GitHub 工作流。 该存储库包含与 ADE 兼容的示例映像组件,包括 Dockerfile 和 shell 脚本,用于使用 Terraform IaC 模板部署和删除环境。 此示例代码可帮助你创建自己的容器映像。
2.安装所需的包 在此步骤中,你将在映像中安装所需的任何包,包括 Terraform。 可以将 Terraform CLI 安装到可执行文件位置,以便在部署和删除脚本中使用它。
下面是安装 Terraform CLI 版本 1.7.5 的过程示例:
RUN wget -O terraform.zip https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip
RUN unzip terraform.zip && rm terraform.zip
RUN mv terraform /usr/bin/terraform
3.配置操作 shell 脚本
在标准映像中,将根据操作名称来确定和执行操作。 目前,支持的两个操作名称是 deploy 和 delete 。
若要设置自定义映像以利用此结构,请在名为 scripts 的 Dockerfile 级别指定一个文件夹,然后指定两个文件 deploy.sh 和 delete.sh 。deploy shell 脚本在创建或重新部署环境时运行,delete shell 脚本在删除环境时运行。 可以在 Terraform 的 scripts 文件夹 的存储库中查看 shell 脚本示例。
若要确保这些 shell 脚本是可执行的,请将以下行添加到 Dockerfile:
COPY scripts/* /scripts/
RUN find /scripts/ -type f -iname "*.sh" -exec dos2unix '{}' '+'
RUN find /scripts/ -type f -iname "*.sh" -exec chmod +x {} \;
4.创建使用 Terraform CLI 的操作 shell 脚本
通过 Terraform 部署基础结构分为三个步骤:
terraform init
- 初始化 Terraform CLI 以在工作目录中执行操作
terraform plan
- 根据传入的 Terraform 基础结构文件和变量以及任何现有状态文件制定计划,并制定创建或更新 .tf 文件中指定的基础结构所需的步骤
terraform apply
- 应用计划以在 Azure 中创建新的基础结构或更新现有基础结构
在核心映像的入口点内,任何现有状态文件都被拉取到容器中,目录保存在环境变量 $ADE_STORAGE
下。 此外,为当前环境设置的任何参数都存储在变量 $ADE_OPERATION_PARAMETERS
下。 若要访问现有状态文件并在 .tfvars.json 文件中设置变量,请运行以下命令 :
set -e #set script to exit on error
EnvironmentState="$ADE_STORAGE/environment.tfstate"
EnvironmentPlan="/environment.tfplan"
EnvironmentVars="/environment.tfvars.json"
echo "$ADE_OPERATION_PARAMETERS" > $EnvironmentVars
此外,若要利用 ADE 的权限在订阅中部署基础结构,则在使用 Terraform AzureRM 提供程序预配基础结构时,脚本需要使用托管服务标识 (MSI)。 如果你的部署需要特殊权限才能完成部署(例如特定角色),请将这些权限分配给用于环境部署的项目环境类型的标识。 ADE 设置相关的环境变量,例如核心映像入口点内的客户端、租户和订阅 ID,因此请运行以下命令以确保提供程序使用 ADE 的 MSI:
export ARM_USE_MSI=true
export ARM_CLIENT_ID=$ADE_CLIENT_ID
export ARM_TENANT_ID=$ADE_TENANT_ID
export ARM_SUBSCRIPTION_ID=$ADE_SUBSCRIPTION_ID
如果要在模板中引用其他变量但并未在环境参数中指定这些变量,请使用前缀 TF_VAR 设置环境变量 。 Azure 部署环境 CLI 变量参考 中提供了提供的 ADE 环境变量的列表。 这些命令的示例如下:
export TF_VAR_resource_group_name=$ADE_RESOURCE_GROUP_NAME
export TF_VAR_ade_env_name=$ADE_ENVIRONMENT_NAME
export TF_VAR_env_name=$ADE_ENVIRONMENT_NAME
export TF_VAR_ade_subscription=$ADE_SUBSCRIPTION_ID
export TF_VAR_ade_location=$ADE_ENVIRONMENT_LOCATION
export TF_VAR_ade_environment_type=$ADE_ENVIRONMENT_TYPE
现在,可以运行前面列出的步骤来初始化 Terraform CLI,生成基础结构预配计划,并在部署脚本期间应用计划:
terraform init
terraform plan -no-color -compact-warnings -refresh=true -lock=true -state=$EnvironmentState -out=$EnvironmentPlan -var-file="$EnvironmentVars"
terraform apply -no-color -compact-warnings -auto-approve -lock=true -state=$EnvironmentState $EnvironmentPlan
在删除脚本中,可以将 destroy
标志添加到计划生成部分以删除现有资源,如以下示例中所示:
terraform init
terraform plan -no-color -compact-warnings -destroy -refresh=true -lock=true -state=$EnvironmentState -out=$EnvironmentPlan -var-file="$EnvironmentVars"
terraform apply -no-color -compact-warnings -auto-approve -lock=true -state=$EnvironmentState $EnvironmentPlan
最后,若要在通过 Azure CLI 访问环境时上传并访问部署的输出,请通过 JQ 包将输出对象从 Terraform 转换为 ADE 指定的格式。 设置 $ADE_OUTPUTS 环境变量的值,如以下示例中所示:
tfOutputs=$(terraform output -state=$EnvironmentState -json)
# Convert Terraform output format to ADE format.
tfOutputs=$(jq 'walk(if type == "object" then
if .type == "bool" then .type = "boolean"
elif .type == "list" then .type = "array"
elif .type == "map" then .type = "object"
elif .type == "set" then .type = "array"
elif (.type | type) == "array" then
if .type[0] == "tuple" then .type = "array"
elif .type[0] == "object" then .type = "object"
elif .type[0] == "set" then .type = "array"
else .
end
else .
end
else .
end)' <<< "$tfOutputs")
echo "{\"outputs\": $tfOutputs}" > $ADE_OUTPUTS
生成自定义映像
你可以使用 Docker CLI 构建你的映像。 确保计算机上已安装 Docker 引擎 。 然后,导航到 Dockerfile 的目录并运行以下命令:
docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}
例如,如果要将映像保存在名为 customImage
的注册表中的存储库下,并使用 1.0.0
的标记版本进行上传,请运行:
docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0
使用 Pulumi 提供的标准容器映像
Pulumi 团队提供了一个预生成映像供你开始操作,你可以在 Runner-Image 文件夹中看到它。 此映像在 Pulumi 的 Docker Hub 中作为 pulumi/azure-deployment-environments
公开提供,因此你可以直接从 ADE 环境定义使用它。
下面是利用预生成映像的示例 environment.yaml 文件 :
name: SampleDefinition
version: 1.0.0
summary: First Pulumi-Enabled Environment
description: Deploys a Storage Account with Pulumi
runner: pulumi/azure-deployment-environments:0.1.0
templatePath: Pulumi.yaml
可以在 Environments 文件夹 中找到一些示例环境定义。
创建自定义映像
通过创建自定义容器映像,可以自定义部署来满足你的要求。 可以根据 Pulumi 标准映像创建自定义映像,并对其进行自定义以满足你的要求。 完成映像自定义后,你必须生成映像并将其推送到容器注册表。
要创建为 ADE 配置的映像,请执行以下步骤:
基于标准映像创建自定义映像。
安装所需的程序包。
配置操作 shell 脚本。
创建使用 Pulumi CLI 的操作 shell 脚本。
1.基于标准映像创建自定义映像
创建一个 DockerFile,在其中包括一个 FROM 语句,指向 Microsoft 工件注册表上托管的标准映像。
下面是引用标准核心映像的示例 FROM 语句:
FROM mcr.microsoft.com/deployment-environments/runners/core:latest
此语句拉取最近发布的核心映像,并使其成为你的自定义映像的基础。
2.安装所需的程序包
可以将 Pulumi CLI 安装到可执行文件位置,以便在部署和删除脚本中使用它。
下面是安装最新版 Pulumi CLI 的过程示例:
RUN apk add curl
RUN curl -fsSL https://get.pulumi.com | sh
ENV PATH="${PATH}:/root/.pulumi/bin"
可能需要安装一个或多个相应的运行时,具体取决于要用于 Pulumi 程序的编程语言。 Python 运行时已在基础映像中提供。
下面是安装 Node.js 和 TypeScript 的示例:
# install node.js, npm, and typescript
RUN apk add nodejs npm
RUN npm install typescript -g
ADE 标准映像基于 Azure CLI 映像,并且预安装了 ADE CLI 和 JQ 包。 可以详细了解 Azure CLI 和 JQ 包 。
若要在映像中安装所需的任何其他包,请使用 RUN 语句。
通过 Pulumi 部署基础结构有四个步骤:
pulumi login
- 连接到本地文件系统或 Pulumi Cloud 中的状态存储
pulumi stack select
- 创建或选择要用于特定环境的堆栈
pulumi config set
- 将部署参数作为 Pulumi 配置值传递
pulumi up
- 运行部署以在 Azure 中创建新的基础结构或更新现有基础结构
在核心映像的入口点内,任何现有本地状态文件都被拉取到容器中,目录保存在环境变量 $ADE_STORAGE
下。 若要访问现有状态文件,请运行以下命令:
mkdir -p $ADE_STORAGE
export PULUMI_CONFIG_PASSPHRASE=
pulumi login file://$ADE_STORAGE
若要改为登录到 Pulumi Cloud,请将 Pulumi 访问令牌设置为环境变量,并运行以下命令:
export PULUMI_ACCESS_TOKEN=YOUR_PULUMI_ACCESS_TOKEN
pulumi login
为当前环境设置的任何参数都存储在变量 $ADE_OPERATION_PARAMETERS
下。 此外,所选的 Azure 区域和资源组名称分别通过 ADE_ENVIRONMENT_LOCATION
和 ADE_RESOURCE_GROUP_NAME
传递。 若要设置 Pulumi 堆栈配置,请运行以下命令:
# Create or select the stack for the current environment
pulumi stack select $ADE_ENVIRONMENT_NAME --create
# Store configuration values in durable storage
export PULUMI_CONFIG_FILE=$ADE_STORAGE/Pulumi.$ADE_ENVIRONMENT_NAME.yaml
# Set the Pulumi stack config
pulumi config set azure-native:location $ADE_ENVIRONMENT_LOCATION --config-file $PULUMI_CONFIG_FILE
pulumi config set resource-group-name $ADE_RESOURCE_GROUP_NAME --config-file $PULUMI_CONFIG_FILE
echo "$ADE_OPERATION_PARAMETERS" | jq -r 'to_entries|.[]|[.key, .value] | @tsv' |
while IFS=$'\t' read -r key value; do
pulumi config set $key $value --config-file $PULUMI_CONFIG_FILE
done
此外,若要利用 ADE 权限在订阅中部署基础结构,则在使用 Pulumi Azure Native 或 Azure Classic 提供程序预配基础结构时,脚本需要使用 ADE 托管服务标识 (MSI)。 如果你的部署需要特殊权限才能完成部署(例如特定角色),请将这些权限分配给用于环境部署的项目环境类型的标识。 ADE 设置相关的环境变量,例如核心映像入口点内的客户端、租户和订阅 ID,因此运行以下命令以确保提供程序使用 ADE MSI:
export ARM_USE_MSI=true
export ARM_CLIENT_ID=$ADE_CLIENT_ID
export ARM_TENANT_ID=$ADE_TENANT_ID
export ARM_SUBSCRIPTION_ID=$ADE_SUBSCRIPTION_ID
现在,可以运行 pulumi up
命令来执行部署:
pulumi up --refresh --yes --config-file $PULUMI_CONFIG_FILE
在删除脚本期间,可以改为运行 destroy
命令,如以下示例所示:
pulumi destroy --refresh --yes --config-file $PULUMI_CONFIG_FILE
最后,若要在通过 Azure CLI 访问环境时上传并访问部署的输出,请通过 JQ 包将输出对象从 Pulumi 转换为 ADE 指定的格式。 设置 $ADE_OUTPUTS 环境变量的值,如以下示例中所示:
stackout=$(pulumi stack output --json | jq -r 'to_entries|.[]|{(.key): {type: "string", value: (.value)}}')
echo "{\"outputs\": ${stackout:-{\}}}" > $ADE_OUTPUTS
生成自定义映像
你可以使用 Docker CLI 构建你的映像。 确保计算机上已安装 Docker 引擎 。 然后,导航到 Dockerfile 的目录并运行以下命令:
docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}
例如,如果要将映像保存在名为 customImage
的注册表中的存储库下,并使用 1.0.0
的标记版本进行上传,请运行:
docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0
使自定义映像可供 ADE 使用
为了使用自定义映像,需要将它们存储在容器注册表中。 你可以使用公共容器注册表,也可以使用专用容器注册表。 强烈建议使用 Azure 容器注册表 (ACR),由于它与 ADE 紧密集成,因此可以发布映像,但不允许进行公共匿名拉取访问。 必须生成自定义容器映像并将其推送到容器注册表,才能在 ADE 中使用它。
也可以将映像存储在另一个容器注册表(例如 Docker Hub 容器注册表)中,但这种情况下它需要可供公开访问。
注意
将容器映像存储在具有匿名(未经身份验证)拉取访问权限的注册表中,会使其可公开访问。 如果映像中包含任何敏感信息,请不要这样做。 相反,请将其存储在禁用了匿名拉取访问的 Azure 容器注册表 (ACR) 中。
若要使用存储在 ACR 中的自定义映像,需确保 ADE 具有访问映像的相应权限。 创建 ACR 实例时,默认情况下它是安全的,并且仅允许经过身份验证的用户访问。
可以使用 Pulumi 创建 Azure 容器注册表并将映像发布到该注册表。 有关在 Azure 帐户中创建所有所需资源的自包含 Pulumi 项目,请参阅预配/自定义映像 示例。
请选择相应的选项卡来了解有关每种方法的详细信息。
使用具有安全访问权限的专用注册表
默认情况下,只有已经过身份验证的用户才拥有从 Azure 容器注册表拉取或推送内容的访问权限。 可以通过限制来自某些网络的访问并分配特定角色来进一步保护对 ACR 的访问。
若要通过 Azure CLI、Azure 门户、PowerShell 命令等创建 ACR 的实例,请遵循相应的快速入门 。
限制网络访问
为了保护对 ACR 的网络访问,可以限制对你自己的网络的访问,或者完全禁用公用网络访问。 如果限制网络访问,则必须启用防火墙例外“允许受信任的 Microsoft 服务访问此容器注册表” 。
若要禁用从公用网络进行的访问,请执行以下操作:
创建 ACR 实例 或使用现有实例。
在 Azure 门户中,转到要配置的 ACR。
在左侧菜单上的“设置”下,选择“网络”。
在“网络”页的“公共访问”选项卡的“公用网络访问”下选择“禁用”。
在“防火墙例外” 下,检查是否已选中“允许受信任的 Microsoft 服务访问此容器注册表”,然后选择“保存” 。
分配 AcrPull 角色
使用容器映像创建环境的操作使用 ADE 基础结构,其中包括项目和环境类型。 每个项目都有一个或多个项目环境类型,这些项目环境类型需要对容器映像(用于定义要部署的环境)的读取访问权限。 为了安全地访问 ACR 中的映像,请将 AcrPull 角色分配给每个项目环境类型。
若要将 AcrPull 角色分配给项目环境类型,请执行以下操作:
在 Azure 门户中,转到要配置的 ACR。
在左侧菜单中,选择“访问控制 (IAM)”。
选择“添加”>“添加角色分配”。
分配以下角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色 。
设置
值
角色
选择“AcrPull” 。
将访问权限分配到
选择“用户、组或服务主体”。
成员
输入需要访问容器中映像的项目环境类型的名称。
项目环境类型如下例所示:
在此配置中,ADE 使用 PET 的托管标识,无论该标识是系统分配的还是用户分配的。
提示
必须针对每种项目环境类型进行此角色分配。 它可以通过 Azure CLI 自动完成。
准备好将映像推送到注册表后,请运行以下命令:
docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}
将公共注册表与匿名拉取配合使用
若要将注册表设置为启用匿名映像拉取,请在 Azure CLI 中运行以下命令:
az login
az acr login -n {YOUR_REGISTRY}
az acr update -n {YOUR_REGISTRY} --public-network-enabled true
az acr update -n {YOUR_REGISTRY} --anonymous-pull-enabled true
准备好将映像推送到注册表后,请运行以下命令:
docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}
将映像连接到环境定义
创作环境定义以在其部署中使用自定义映像时,请编辑清单文件(environment.yaml 或 manifest.yaml)上的 runner
属性。
runner: "{YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}"
若要详细了解如何创建使用 ADE 容器映像部署 Azure 资源的环境定义,请参阅添加和配置环境定义 。
相关内容