如何向 GitLab Terraform 提供程序提供 API 令牌作为 Terraform 秘密资源?

How do I supply an API token to the GitLab Terraform provider as a Terraform secret resource?

我正在尝试使用 Terraform 来管理一些 GitLab(自托管)配置。 Terraform GitLab 提供程序需要 GitLab 个人访问令牌才能进行 API 调用以读取和写入配置。当我尝试使用 Terraform secret_resource 提供此令牌时,Terraform 无法让我管理机密。当我尝试导入密钥时,Terraform 失败:

$ terraform import secret_resource.api_token "xxx"                                                                                        
secret_resource.api_token: Importing from ID "xxx"...
secret_resource.api_token: Import prepared!
  Prepared secret_resource for import
secret_resource.api_token: Refreshing state... [id=-]

Error: GET https://gitlab.example.com./api/v4/user/api/v4/user: 404 {error: 404 Not Found}

  on /path/to/providers.tf line 24, in provider "gitlab":                                                                                                          
  24: provider "gitlab" {

这是重现此行为的最小 Terraform:

terraform {
  required_version = "~> 0.13.6"                                                                                     

  required_providers {
    gitlab = {
      source = "nixpkgs/gitlab"
      version = "> 3.4.99"                                                                                           
    }
    secret = {
      source = "nixpkgs/secret"
      version = "~> 1.1"                                                                                             
      alias = "default"                                                                                              
    }
  }
}

resource "secret_resource" "api_token" {                                                                             
  lifecycle {
    prevent_destroy = true
  }
}

provider "gitlab" {                                                                                                  
  base_url = "https://gitlab.example.com./api/v4/user"                                             
  token = secret_resource.api_token.value                                                                            
}

resource "gitlab_project" "foo" {
    name = "foo"
}

我省略了真实的主机名和 GitLab 令牌值。我可以通过使用此配置初始化新的 Terraform 根模块然后尝试导入密钥来可靠地重现此故障。

这似乎是一个不合理的失败 - secret_resource 不依赖于 GitLab 提供者。如果 Terraform 允许导入该值,那么它将可用,然后 GitLab 提供程序将被正确配置。

我观察到这种行为:

我希望能够继续使用 secret_resource 来管理 GitLab API 令牌。我怎么能?

从错误消息来看,似乎 base_url 配置不正确。 /api/v4/user出现两次:

Error: GET https://gitlab.example.com./api/v4/user/api/v4/user: 404 {error: 404 Not Found}

尝试将 base_url 设置为仅包含主机名的斜杠:

provider "gitlab" {                                                                                                  
  base_url = "https://gitlab.example.com/"                                             
  token = secret_resource.api_token.value                                                                            
}

您的地址 (gitlab.example.com.) 中也有一个点,应该是 gitlab.example.com.