为 Terraform Cloud 设置 Google Cloud Platform (GCP) 身份验证

Sla*_* II 8 google-cloud-storage google-cloud-platform terraform devops terraform-provider-gcp

如何配置 Terraform Cloud 以通过 Google Cloud Platform (GCP) 进行身份验证?

现在,我的配置如下所示:

provider "google" {
  project = "my-project-id"
  region = "europe-west3"
  zone = "europe-west3-a"
}

resource "google_storage_bucket" "my-bucket" {
  name = "my-bucket"
  location = "EUROPE-WEST3"
  force_destroy = true
  uniform_bucket_level_access = true
}
Run Code Online (Sandbox Code Playgroud)

这给我带来了一个错误:

错误:尝试加载应用程序默认凭据,因为提供程序块中既没有设置credentials也没有设置。access_token未加载凭据。要使用您的 gcloud 凭据,请运行“gcloud auth application-default login”。原始错误:谷歌:找不到默认凭据。有关详细信息,请参阅https://developers.google.com/accounts/docs/application-default-credentials 。

Sla*_* II 19

首先,您需要在 GCP 项目中设置一个服务帐户,以便 Terraform Cloud 能够为您管理资源。只需执行以下操作:

\n
    \n
  1. 登录GCP控制台并切换到所需的项目。
  2. \n
  3. 转到IAM 和管理 \xe2\x86\x92 服务帐户部分。
  4. \n
  5. “创建服务帐户”按钮。
  6. \n
  7. 为您的服务帐户指定一个有意义的名称,然后单击“创建并继续”
  8. \n
  9. 为您的服务帐户指定角色。出于测试目的,您可以使用Owner具有最大权限的角色。但是,在生产中,我强烈建议为您的服务帐户创建一个具有尽可能少的权限的单独角色。
  10. \n
  11. 然后单击“完成”以最终创建服务帐户。
  12. \n
  13. 现在,从列表中选择新创建的帐户,然后转到“KEYS”选项卡。
  14. \n
  15. “添加密钥”按钮并选择“创建新密钥”选项。
  16. \n
  17. 选择 JSON 格式并按“创建”
  18. \n
  19. 将密钥文件下载到您的计算机并在您喜欢的文本编辑器中打开它。
  20. \n
  21. 提供的密钥采用多行 JSON 格式,但是,为了能够在 Terraform 配置中使用它,应该缩小它。您可以使用任何您可以信任的 JSON 压缩器。否则,您可以使用文本编辑器的“查找和替换”功能来删除所有多行字符。最后,您应该收到一个 JSON 文档,作为单行文本,复制它。
  22. \n
\n

现在,您需要在 Terraform 配置中指定 JSON 键。最直接的方法是将其直接放入属性下的 google 提供程序配置中credentials。然而,在代码中存储此类敏感数据是非常糟糕的做法。我们会做其他事情:

\n
    \n
  1. 将以下变量声明添加到 Terraform 配置文件中:
  2. \n
\n
variable "gcp_credentials" {\n  type = string\n  sensitive = true\n  description = "Google Cloud service account credentials"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这将告诉 Terraform 该输入变量确实存在并且可用于配置堆栈。

\n
    \n
  1. 然后,转到 Terraform Cloud 控制台并切换到所需的工作区。转到“变量”选项卡。

    \n
  2. \n
  3. 现在,按“添加变量”按钮并指定以下数据:

    \n
      \n
    • 钥匙: gcp_credentials
    • \n
    • 价值: INSERT YOUR SINGLE-LINE JSON HERE
    • \n
    • 描述: Google Cloud service account credentials
    • \n
    • 选中“敏感”复选框。
    • \n
    \n
  4. \n
  5. 单击“保存变量按钮”

    \n
  6. \n
\n

最后,更新您的提供程序配置,如下所示:

\n
provider "google" {\n  project = "my-project-id"\n  credentials = var.gcp_credentials\n  region = "europe-west3"\n  zone = "europe-west3-a"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

使用这种方法,您的秘密 JSON 密钥将由 Terraform Cloud 安全存储,任何人都无法直接读取它(由于“敏感”选项),并且该密钥将在运行时通过以下方式提供给 Google 提供商: Terraform 输入变量。

\n

但是,请注意,这不是一种存储秘密的万无一失的方法,并且在某些情况下,能够更新配置和读取日志文件的一方可以读取变量的内容。

\n
\n

我还建议从配置文件中移动其他信息,例如区域/区域和项目 ID。这将使您的堆栈更具可重用性,并使您的配置更清晰(通过删除重复)。

\n

这是最后一个例子:

\n
#===========#\n# VARIABLES #\n#===========#\n\nvariable "gcp_project_id" {\n  type = string\n  description = "Google Cloud project ID"\n}\n\nvariable "gcp_credentials" {\n  type = string\n  sensitive = true\n  description = "Google Cloud service account credentials"\n}\n\nvariable "gcp_region" {\n  type = string\n  description = "Google Cloud region"\n}\n\nvariable "gcp_zone" {\n  type = string\n  description = "Google Cloud zone"\n}\n\n\n#===========#\n# PROVIDERS #\n#===========#\n\nprovider "google" {\n  project = var.gcp_project_id\n  credentials = var.gcp_credentials\n  region = var.gcp_region\n  zone = var.gcp_zone\n}\n\n\n#===========#\n# RESOURCES #\n#===========#\n\nresource "google_storage_bucket" "my-bucket" {\n  name = "my-bucket"\n  location = var.gcp_region\n  force_destroy = true\n  uniform_bucket_level_access = true\n}\n
Run Code Online (Sandbox Code Playgroud)\n