首页 > 解决方案 > 动态生成和引用 Terraform 块

问题描述

我正在创建一个 Terraform 模块,我想将其用作某种模板(使用 Terragrunt)。有一些配置部分在部署中将保持不变,但其他一些配置部分将特定于每个部署。

在这种情况下,我想设置一些秘密值,这些值将通过秘密管理器注入,然后在 Helm 图表中引用。

所以要转换这样的东西:


resource random_password auth_password {
  length            = 16
  special           = true
}

resource google_secret_manager_secret auth_password {
  provider  = google-beta
  secret_id = "${var.prefix}-auth-password"

  replication {
    automatic = true
  }
}

resource google_secret_manager_secret_version auth_password {
  provider    = google-beta
  secret      = google_secret_manager_secret.auth_password.name
  secret_data = base64encode(random_password.auth_password.result)
}



helm_release deploy {

  ...


  set {
    name  = "auth_password"
    value = base64decode(google_secret_manager_secret_version.auth_password.secret_data)
  }


}


变成这样:

for secret in e.secrets {

  resource random_password "auth_password_${secret.name}" {
    length            = 16
    special           = true
  }

  resource google_secret_manager_secret "auth_password_${secret.name}" {
    provider  = google-beta
    secret_id = "${var.prefix}-auth-password-${secret.name}"

  }

  resource google_secret_manager_secret_version "auth_password_${secret.name}" {
    provider    = google-beta
    secret      = google_secret_manager_secret."auth_password_${secret.name}".name
    secret_data = base64encode(random_password."auth_password_${secret.name}".result)
  }

}

helm deploy {


  ...

  for secret in e.secrets {
    
    set {
      name  = "auth_password_${secret.name}"
      value = base64decode(google_secret_manager_secret_version."auth_password_${secret.name}".secret_data)
    }

  }

}


这里的关键是这些被注入的值是敏感的,因此它们不能作为纯文本放在源代码中。此外,如果只有当前工具包的解决方案可用,我不会考虑在此阶段实施 Sops。

我在块上尝试了多种方法,例如动态块指令for_each,但到目前为止它们还没有起作用,因为它们在引用其他动态创建的块方面存在不足。

谢谢。

当前版本:

标签: terraformterragrunt

解决方案


推荐阅读