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

Posted

技术标签:

【中文标题】使用 Terraform 将文件上传到 AWS Secrets Manager【英文标题】:upload file into AWS Secrets Manager using Terraform 【发布时间】:2021-04-21 01:11:23 【问题描述】:

需要对以下示例的语法进行哪些特定更改才能使 Terraform 成功将命名文件上传到 AWS Secrets Manager 中的密钥中?

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

如果无法上传文件对象,那么第二个最佳答案将显示如何上传文件的文本内容。请注意,该文件是一个 x509 证书,需要由在 EC2 实例中运行的程序使用。文本内容是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 userdata 命令是:

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)

【问题讨论】:

【参考方案1】:

如果您使用的是secret_binary,则应在 AWS CLI 中使用SecretBinary

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

【讨论】:

以上是关于使用 Terraform 将文件上传到 AWS Secrets Manager的主要内容,如果未能解决你的问题,请参考以下文章

从 terraform 上传 AWS S3 中的多个文件

AWS Lambda 不会等待代码上传到 Terraform 脚本中的 S3 存储桶

如何在 Azure Pipeline 上使用 Terraform 将文件上传到 Azure 存储?

将多个文件上传到 Terraform 中的多个 S3 存储桶

Terraform 和 AWS:修改现有策略

Terraform 0.11:无法将动态安全组添加到 aws 实例