向 Azure 验证 Terraform
使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 利用 HCL 语法,可指定 Azure 这样的云提供程序和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证了更改后,请应用该执行计划以部署基础结构。
若要针对 Azure 订阅使用 Terraform 命令,需要先让该订阅对 Terraform 进行身份验证。 本文介绍了一些向 Azure 进行身份验证的常见方案。
在本文中,学习如何:
- 了解常见 Terraform 和 Azure 身份验证方案
- 从 Cloud Shell 通过 Microsoft 帐户进行身份验证(使用 Bash 或 PowerShell)
- 从 Windows 通过 Microsoft 帐户进行身份验证(使用 Bash 或 PowerShell)
- 使用 Azure CLI 创建服务主体
- 使用 Azure PowerShell 创建服务主体
- 在环境变量中指定服务主体凭据
- 在 Terraform 提供程序块中指定服务主体凭据
1.配置环境
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
配置 Terraform:如果尚未执行此操作,请使用以下选项之一配置 Terraform:
2. 向 Azure 验证 Terraform
Terraform 和 Azure 身份验证方案
Terraform 仅支持通过 Azure CLI 向 Azure 进行身份验证。 不支持使用 Azure PowerShell 进行身份验证。 因此,虽然可以在进行 Terraform 工作时使用 Azure PowerShell 模块,不过首先需要使用 Azure CLI 向 Azure 进行身份验证。
本文说明如何在以下方案中向 Azure 验证 Terraform。 有关向 Azure 验证 Terraform 的选项的详细信息,请参阅使用 Azure CLI 进行身份验证。
- 使用 Cloud Shell(借助 Bash 或 PowerShell)通过 Microsoft 帐户进行身份验证
- 使用 Windows(借助 Bash 或 PowerShell)通过 Microsoft 帐户进行身份验证
- 通过服务主体进行身份验证:
通过 Microsoft 帐户向 Azure 进行身份验证
Microsoft 帐户是用于登录 Microsoft 服务(如 Azure)的用户名(与电子邮件及其凭据关联)。 Microsoft 帐户可以与一个或多个 Azure 订阅关联,其中一个订阅是默认订阅。
以下步骤演示了操作方法:
- 使用 Microsoft 帐户以交互方式登录到 Azure
- 列出帐户的关联 Azure 订阅(包括默认)
- 设置当前订阅。
打开有权访问 Azure CLI 的命令行。
运行不带任何参数的 az login,并按照说明登录 Azure。
az login
要点:
- 成功登录后,
az login
会显示与已登录 Microsoft 帐户相关联的 Azure 订阅的列表(包括默认订阅)。
- 成功登录后,
若要查看当前 Azure 订阅,请运行 az account show。
az account show
若要查看特定 Microsoft 帐户的所有 Azure 订阅名称和 ID,请运行 az account list。
az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
要点:
- 将
<microsoft_account_email>
占位符替换为要列出其 Azure 订阅的 Microsoft 帐户电子邮件地址。 - 使用 Live 帐户(如 Hotmail 或 Outlook)时,可能需要指定完全限定的电子邮件地址。 例如,如果电子邮件地址为
admin@hotmail.com
,则可能需要将占位符替换为live.com#admin@hotmail.com
。
- 将
若要使用特定 Azure 订阅,请运行 az account set。
az account set --subscription "<subscription_id_or_subscription_name>"
要点:
- 将
<subscription_id_or_subscription_name>
占位符替换为要使用的订阅的 ID 或名称。 - 调用
az account set
不会显示切换到指定的 Azure 订阅的结果。 但是,可以使用az account show
来确认当前的 Azure 订阅是否已更改。 - 如果运行上一步中的
az account list
命令,则会看到默认 Azure 订阅已更改为使用az account set
指定的订阅。
- 将
创建服务主体
部署或使用 Azure 服务的自动化工具(例如 Terraform)应始终具有受限权限。 Azure 提供了服务主体,而不是让应用程序以具有完全特权的用户身份登录。
最常见的模式是以交互方式登录 Azure,创建服务主体,测试服务主体,然后将该服务主体用于将来的身份验证(以交互方式或通过脚本)。
若要创建服务主体,请登录到 Azure。 通过 Microsoft 帐户向 Azure 进行身份验证之后,请返回此处。
如果通过 Git Bash 创建服务主体,请设置
MSYS_NO_PATHCONV
环境变量。 (如果使用的是 Cloud Shell,则此步骤不是必需的。)export MSYS_NO_PATHCONV=1
要点:
- 可以在全局(为所有终端会话)或本地(只为当前会话)设置
MSYS_NO_PATHCONV
环境变量。 由于创建服务主体不是经常执行的操作,因此示例会为当前会话设置值。 若要在全局设置此环境变量,请将设置添加到~/.bashrc
文件。
- 可以在全局(为所有终端会话)或本地(只为当前会话)设置
若要创建服务主体,请使用 az ad sp create-for-rbac。
az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
要点:
- 可以将
<service-principal-name>
替换为适用于环境的自定义名称,也可以完全省略该参数。 如果省略该参数,则基于当前日期和时间生成服务主体名称。 - 成功完成后,
az ad sp create-for-rbac
会显示多个值。 下一步中将使用appId
、password
和tenant
值。 - 如果丢失了密码,则无法对其进行检索。 因此,应将密码存储在安全的位置。 如果忘记了密码,则可以重置服务主体凭据。
- 对于本文,会使用一个具有“参与者”角色的服务主体。 有关基于角色的访问控制 (RBAC) 角色的详细信息,请参阅 RBAC:内置角色。
- 创建服务主体的输出包含敏感凭据。 请确保没有将这些凭据包含在代码中,也没有将凭据签入到源代码管理中。
- 有关使用 Azure CLI 创建服务主体时的选项的详细信息,请参阅使用 Azure CLI 创建 Azure 服务主体一文。
- 可以将
在环境变量中指定服务主体凭据
创建服务主体后,可以通过环境变量将其凭据指定给 Terraform。
通过添加以下环境变量来编辑
~/.bashrc
文件。export ARM_SUBSCRIPTION_ID="<azure_subscription_id>" export ARM_TENANT_ID="<azure_subscription_tenant_id>" export ARM_CLIENT_ID="<service_principal_appid>" export ARM_CLIENT_SECRET="<service_principal_password>"
若要执行
~/.bashrc
脚本,请运行source ~/.bashrc
(或其缩写等效项. ~/.bashrc
)。 还可以退出并重新打开 Cloud Shell 以便自动运行脚本。. ~/.bashrc
设置环境变量后,可以验证其值,如下所示:
printenv | grep ^ARM*
要点:
- 与任何环境变量一样,若要从 Terraform 脚本中访问 Azure 订阅值,请使用以下语法:
${env.<environment_variable>}
。 例如,若要访问ARM_SUBSCRIPTION_ID
值,请指定${env.ARM_SUBSCRIPTION_ID}
。 - 创建并应用 Terraform 执行计划会对与服务主体关联的 Azure 订阅进行更改。 如果登录一个 Azure 订阅,而环境变量指向另一个 Azure 订阅,这一事实有时可能会令人困惑。 请看以下示例进行说明。 假设有两个 Azure 订阅:SubA 和 SubB。 如果当前 Azure 订阅是 SubA(通过
az account show
确定),而环境变量指向 SubB,则 Terraform 进行的任何更改都在 SubB 上。 因此,需要登录 SubB 订阅运行 Azure CLI 命令或 Azure PowerShell 命令以查看更改。
在 Terraform 提供程序块中指定服务主体凭据
Azure 提供程序块定义用于指定 Azure 订阅的身份验证信息的语法。
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>2.0"
}
}
}
provider "azurerm" {
features {}
subscription_id = "<azure_subscription_id>"
tenant_id = "<azure_subscription_tenant_id>"
client_id = "<service_principal_appid>"
client_secret = "<service_principal_password>"
}
# Your code goes here
注意
能够在 Terraform 配置文件中指定 Azure 订阅凭据可能会十分方便 - 尤其是在测试时。 但是,不建议将凭据存储在可以由不受信任的个人查看的明文文件中。
3. 验证结果
通过显示当前订阅,验证确认已向 Azure 订阅进行身份验证。
若要通过 Azure CLI 确认当前 Azure 订阅,请运行 az account show。
az account show
后续步骤
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈