使用 Terraform 将文件上传到 AWS Secrets Manager

upload file into AWS Secrets Manager using Terraform

What specific changes need to be made to the syntax of the example below in order for Terraform to successfully upload the named file into a secret in AWS Secrets Manager?

请注意,AWS EC2 实例 运行 Amazon Linux 2 也是由同一 Terraform 模块创建的,需要从 Secrets 管理器中检索此文件。同一个 Amazon Linux 2 EC2 实例已经能够从同一个 AWS Secrets Manager 中成功检索字符串机密。因此,这个问题被隔离到上传一个文件而不是一个短字符串。

如果无法上传文件对象,那么第二个最佳答案将显示如何上传文件的文本内容。请注意,该文件是 EC2 实例中的程序 运行 需要使用的 x509 证书。文本内容为典型的x509证书长度,属于比较小的文本量。

当前代码:

variable "certFileAndPath" { default = "C:\path\to\the\x509\certificate.crt" } 

resource "aws_secretsmanager_secret" "example-cert" {
  name = "example-cert"
  recovery_window_in_days = 0
}

resource "aws_secretsmanager_secret_version" "cert-val" {
  secret_id     = aws_secretsmanager_secret.example-cert.id
  secret_binary = filebase64(var.certFileAndPath)
}

当前结果:

目前,上面的 Terraform 代码导致 None 被检索秘密的 cloud-init 脚本回显。而且,当人类用户试图阅读确实由下面创建的秘密的内容时,秘密管理器的 AWS web UI 控制台不会显示任何内容。 Terraform 运行上面的代码没有抛出错误。

在生成的 EC2 实例的 /var/log/cloud-init-output.log 中回显 Nonecloud-init bash 用户数据命令是:

echo "example-cert is: \n"
echo $(aws secretsmanager get-secret-value --secret-id "example-cert" --version-stage AWSCURRENT --region "${var._region}" --output text --query SecretString)

如果您使用 secret_binary,在 AWS CLI 中您应该使用 SecretBinary:

aws secretsmanager get-secret-value --secret-id "example-cert" --version-stage AWSCURRENT --region "${var._region}" --output text --query SecretBinary