1

我有一个秘密存储在 AWS 秘密管理器中,并试图在运行时将其集成到 terraform 中。我们正在使用 terraform 0.11.13 版本,并且更新到最新的 terraform 在路线图中。

我们都希望将jsondecode()可用的东西用作最新 terraform 的一部分,但在升级 terraform 之前需要集成一些东西。

我们尝试使用https://github.com/terraform-providers/terraform-provider-aws/issues/4789中建议的以下辅助外部数据程序。

data "external" "helper" {
  program = ["echo", "${replace(data.aws_secretsmanager_secret_version.map_example.secret_string, "\\\"", "\"")}"]
}

但是我们现在最终得到了这个错误。

data.external.helper: can't find external program "echo"

谷歌搜索没有太大帮助。

任何帮助都感激不尽。

操作系统:Windows 10

4

1 回答 1

1

听起来您想将 adata source用于aws_secretsmanager_secret.

terraform 中的资源会创建新资源。terraform 中的数据源引用了 terraform 中现有资源的价值。

data "aws_secretsmanager_secret" "example" {
  arn = "arn:aws:secretsmanager:us-east-1:123456789012:secret:example-123456"
}

data "aws_secretsmanager_secret_version" "example" {
  secret_id     = data.aws_secretsmanager_secret.example.id
  version_stage = "example"
}

注意:您也可以使用秘密名称 Docs:https ://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/secretsmanager_secret

然后你可以像这样使用这个值:

output MySecretJsonAsString {
  value = data.aws_secretsmanager_secret_version.example.secret_string
}

根据文档,secret_string此资源的属性是:

最初作为字符串提供的受保护秘密信息的解密部分。

您还应该能够将该值传递给jsondecode然后单独访问 json 主体的属性。


但是您要求提供 terraform 0.11.13 解决方案。如果秘密值由 terraform 定义,您可以使用 terraform state 数据源来获取该值。这确实相信除了 terraform 之外没有其他任何东西在更新秘密。但最好的答案是升级你的 terraform。在此之前,这可能是一个有用的权宜之计。

作为建议,您可以使 terraform 版本特定于一个模块,而不是您的整个组织。我通过使用运行特定版本的 terraform bin 的 docker 容器来做到这一点。每个模块的根目录中都有一个脚本,它将包装 terraform 命令以出现在该项目的 terraform 版本中。只是一个提示。

于 2020-10-09T09:34:15.610 回答