在 AWS Secrets Manager awscli 中收到错误:通过 Terraform 部署时找不到版本 "AWSCURRENT"

Receiving error in AWS Secrets manager awscli for: Version "AWSCURRENT" not found when deployed via Terraform

概述

  1. 创建 aws_secretsmanager_secret
  2. 创建一个aws_secretsmanager_secret_version
  3. 将唯一生成的字符串存储为以上版本
  4. 使用 local-exec provisioner 存储实际的安全字符串 bash
  5. 在例如 RDS 实例部署中使用 secretsmanager 资源引用该字符串。

Objective

  1. 将所有纯文本字符串排除在驻留在 S3 存储桶中的远程状态之外
  2. 使用 AWS Secrets Manager 存储这些字符串
  3. 设置一次,调用Terraform中的资源获取

问题

Error: Secrets Manager Secret "arn:aws:secretsmanager:us-east-1:82374283744:secret:Example-rds-secret-fff42b69-30c1-df50-8e5c-f512464a4a11-pJvC5U" Version "AWSCURRENT" not found

当 运行 terraform apply

问题

为什么它不自动移动 AWSCURRENT 版本?我错过了什么吗?我的 bash 命令错了吗?该值不会写入 secret_version,但会正确引用它。

查看 main.tf 代码,它实际执行命令:

provisioner  "local-exec" {

command =  "bash -c 'RDSSECRET=$(openssl rand -base64 16); aws secretsmanager put-secret-value --secret-id ${data.aws_secretsmanager_secret.secretsmanager-name.arn} --secret-string $RDSSECRET --version-stages AWSCURRENT --region ${var.aws_region} --profile ${var.aws-profile}'"

}

代码

main.tf

data  "aws_secretsmanager_secret_version"  "rds-secret" {

secret_id =  aws_secretsmanager_secret.rds-secret.id

}

  

data  "aws_secretsmanager_secret"  "secretsmanager-name" {

arn =  aws_secretsmanager_secret.rds-secret.arn

}

  

resource  "random_password"  "db_password" {

length =  56

special =  true

min_special =  5

override_special =  "!#$%^&*()-_=+[]{}<>:?"

keepers =  {

pass_version = 1

}

}

  

resource  "random_uuid"  "secret-uuid" { }

  

resource  "aws_secretsmanager_secret"  "rds-secret" {

name =  "DAL-${var.environment}-rds-secret-${random_uuid.secret-uuid.result}"

}

  

resource  "aws_secretsmanager_secret_version"  "rds-secret-version" {

secret_id =  aws_secretsmanager_secret.rds-secret.id

secret_string =  random_password.db_password.result


  

provisioner  "local-exec" {

command =  "bash -c 'RDSSECRET=$(openssl rand -base64 16); aws secretsmanager put-secret-value --secret-id ${data.aws_secretsmanager_secret.secretsmanager-name.arn} --secret-string $RDSSECRET --region ${var.aws_region} --profile ${var.aws-profile}'"

}

}

variables.tf

variable  "aws-profile" {

description =  "Local AWS Profile Name "

type =  "string"

}

  

variable  "aws_region" {

description =  "aws region"

default="us-east-1"

type =  "string"

}

  

variable  "environment" {}

terraform.tfvars

aws_region="us-east-1"

aws-profile="Example-Environment"

environment="dev"

该错误可能不会在您的供应器执行过程中发生,因为如果您删除供应器块,该错误仍然会在应用时发生——但令人困惑的是,它只是在销毁后的第一次。 删除 data "aws_secretsmanager_secret_version" "rds-secret" 块也完全“解决”了错误。

我猜这里存在某种配置延迟问题...但是向 aws_secretsmanager_secret.rds-secret 资源块添加 20 秒延迟供应器并没有帮助。 并且数据块中的值可以在后续的应用运行s中成功输出,所以可能不仅仅是时间问题。

即使您解决了上述更基本的问题,您的供应商仍可能会通过修改 Terraform 试图在同一个 运行 中管理的资源来混淆事情。我不确定是否有办法解决这个问题,除非分成两个单独的操作。

更新:

事实证明,第一个 运行 在创建 aws_secretsmanager_secret_version 资源之前读取数据源。只需将 depends_on = [aws_secretsmanager_secret_version.rds-secret-version] 添加到 data "aws_secretsmanager_secret_version" 块即可完全解决此问题,并使您的配置器的插值也能正常工作。我还没有测试实际的供应商。

您可能还需要考虑这一点(我认为这并不总是适用于 0.13):

NOTE: In Terraform 0.12 and earlier, due to the data resource behavior of deferring the read until the apply phase when depending on values that are not yet known, using depends_on with data resources will force the read to always be deferred to the apply phase, and therefore a configuration that uses depends_on with a data resource can never converge. Due to this behavior, we do not recommend using depends_on with data resources.