【问题标题】:Set up Google Cloud Platform (GCP) authentication for Terraform Cloud为 Terraform Cloud 设置 Google Cloud Platform (GCP) 身份验证
【发布时间】:2021-09-18 05:44:27
【问题描述】:

如何配置 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
}

这给我一个错误:

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

【问题讨论】:

    标签: google-cloud-platform terraform terraform-provider-gcp


    【解决方案1】:

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

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

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

    1. 将以下变量声明添加到您的 Terraform 配置文件:
    variable "gcp_credentials" {
      type = string
      sensitive = true
      description = "Google Cloud service account credentials"
    }
    

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

    1. 然后,转到 Terraform Cloud 控制台并切换到所需的工作区。转到“变量”标签。

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

      • 密钥: gcp_credentials
      • 价值: INSERT YOUR SINGLE-LINE JSON HERE
      • 说明: Google Cloud service account credentials
      • 选中“敏感”复选框。
    3. 点击“保存变量按钮”

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

    provider "google" {
      project = "my-project-id"
      credentials = var.gcp_credentials
      region = "europe-west3"
      zone = "europe-west3-a"
    }
    

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

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


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

    这是最后一个例子:

    #===========#
    # VARIABLES #
    #===========#
    
    variable "gcp_project_id" {
      type = string
      description = "Google Cloud project ID"
    }
    
    variable "gcp_credentials" {
      type = string
      sensitive = true
      description = "Google Cloud service account credentials"
    }
    
    variable "gcp_region" {
      type = string
      description = "Google Cloud region"
    }
    
    variable "gcp_zone" {
      type = string
      description = "Google Cloud zone"
    }
    
    
    #===========#
    # PROVIDERS #
    #===========#
    
    provider "google" {
      project = var.gcp_project_id
      credentials = var.gcp_credentials
      region = var.gcp_region
      zone = var.gcp_zone
    }
    
    
    #===========#
    # RESOURCES #
    #===========#
    
    resource "google_storage_bucket" "my-bucket" {
      name = "my-bucket"
      location = var.gcp_region
      force_destroy = true
      uniform_bucket_level_access = true
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-23
      • 1970-01-01
      • 2020-10-25
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多