在 Terraform for Cloud 运行 中创建动态秘密变量块

Creating a dynamic secret variable block within Terraform for Cloud Run

我正在尝试根据字符串列表动态创建以下块

        env {
          name = "SECRET_ENV_VAR"
      value_from {
            secret_key_ref {
              name = google_secret_manager_secret.secret.secret_id
              key = "1"
            }
          }
        }

基于文档:https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_service#example-usage---cloud-run-service-secret-environment-variables

我想动态添加Secrets,并定义了以下动态块:

        dynamic "env" {
          for_each = toset(var.secrets)
          content {
            name = each.value
            value_from {
              secret_key_ref {
                name = each.value
                key  = "1"
              }
            }
          }
        }

其中secrets是list(string)类型的变量

但是,这会引发错误:Blocks of type "value_from" are not expected here.

我不确定我遗漏了什么,或者我在哪里错误地指定了 value_from 块。

有人可以指出正确的方向来解决这个问题吗?

更新; 我还尝试按照此 post 评论中的建议将此变量实现为地图。 (https://www.terraform.io/docs/language/expressions/dynamic-blocks.html#multi-level-nested-block-structures)

        dynamic "env" {
          for_each = var.secrets
          content {
            name = each.key
            dynamic "value_from" {
              for_each = env.value.name
              secret_key_ref {
                name = value_from.value.name
                key  = value_from.value.version
              }
            }
          }
        }

但是,这也给出了同样的错误。 Blocks of type "value_from" are not expected here.

在此示例中,secrets 变量被定义为具有此值的列表(任意):

secrets = [
    {
      name    = "SECRET"
      version = "1"
    }
  ]

您必须升级您的 gcp 提供程序。在 v3.67.0 中添加了对 google_cloud_run_service 中的秘密的支持。当前版本是 v4.1.0,这意味着您必须使用非常旧的 gcp 提供程序。

最后,我通过将变量类型更改为 map(any) 解决了这个问题:

secrets = {
    "SECRET" = "1"
}

这使我能够创建“动态”env 块,而无需实现嵌套动态块。