向 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 订阅,请在开始之前创建一个免费帐户。

2. 向 Azure 验证 Terraform

Terraform 和 Azure 身份验证方案

Terraform 仅支持通过 Azure CLI 向 Azure 进行身份验证。 不支持使用 Azure PowerShell 进行身份验证。 因此,虽然可以在进行 Terraform 工作时使用 Azure PowerShell 模块,不过首先需要使用 Azure CLI 向 Azure 进行身份验证。

本文说明如何在以下方案中向 Azure 验证 Terraform。 有关向 Azure 验证 Terraform 的选项的详细信息,请参阅使用 Azure CLI 进行身份验证

通过 Microsoft 帐户向 Azure 进行身份验证

Microsoft 帐户是用于登录 Microsoft 服务(如 Azure)的用户名(与电子邮件及其凭据关联)。 Microsoft 帐户可以与一个或多个 Azure 订阅关联,其中一个订阅是默认订阅。

以下步骤演示了操作方法:

  • 使用 Microsoft 帐户以交互方式登录到 Azure
  • 列出帐户的关联 Azure 订阅(包括默认)
  • 设置当前订阅。
  1. 打开有权访问 Azure CLI 的命令行。

  2. 运行不带任何参数的 az login,并按照说明登录 Azure。

    az login
    

    要点

    • 成功登录后,az login 会显示与已登录 Microsoft 帐户相关联的 Azure 订阅的列表(包括默认订阅)。
  3. 若要查看当前 Azure 订阅,请运行 az account show

    az account show
    
  4. 若要查看特定 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
  5. 若要使用特定 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,创建服务主体,测试服务主体,然后将该服务主体用于将来的身份验证(以交互方式或通过脚本)。

  1. 若要创建服务主体,请登录到 Azure。 通过 Microsoft 帐户向 Azure 进行身份验证之后,请返回此处。

  2. 如果通过 Git Bash 创建服务主体,请设置 MSYS_NO_PATHCONV 环境变量。 (如果使用的是 Cloud Shell,则此步骤不是必需的。)

    export MSYS_NO_PATHCONV=1    
    

    要点

    • 可以在全局(为所有终端会话)或本地(只为当前会话)设置 MSYS_NO_PATHCONV 环境变量。 由于创建服务主体不是经常执行的操作,因此示例会为当前会话设置值。 若要在全局设置此环境变量,请将设置添加到 ~/.bashrc 文件。
  3. 若要创建服务主体,请使用 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 会显示多个值。 下一步中将使用 appIdpasswordtenant 值。
    • 如果丢失了密码,则无法对其进行检索。 因此,应将密码存储在安全的位置。 如果忘记了密码,则可以重置服务主体凭据
    • 对于本文,会使用一个具有“参与者”角色的服务主体。 有关基于角色的访问控制 (RBAC) 角色的详细信息,请参阅 RBAC:内置角色
    • 创建服务主体的输出包含敏感凭据。 请确保没有将这些凭据包含在代码中,也没有将凭据签入到源代码管理中。
    • 有关使用 Azure CLI 创建服务主体时的选项的详细信息,请参阅使用 Azure CLI 创建 Azure 服务主体一文。

在环境变量中指定服务主体凭据

创建服务主体后,可以通过环境变量将其凭据指定给 Terraform。

  1. 通过添加以下环境变量来编辑 ~/.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>"
    
  2. 若要执行 ~/.bashrc 脚本,请运行 source ~/.bashrc(或其缩写等效项 . ~/.bashrc)。 还可以退出并重新打开 Cloud Shell 以便自动运行脚本。

    . ~/.bashrc
    
  3. 设置环境变量后,可以验证其值,如下所示:

    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

后续步骤