首页 > 解决方案 > 在 AWS Secrets Manager awscli 中收到错误:通过 Terraform 部署时未找到版本“AWSCURRENT”

问题描述

概述

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

客观的

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

问题

错误:Secrets Manager 秘密“arn:aws:secretsmanager:us-east-1:82374283744:secret:Example-rds-secret-fff42b69-30c1-df50-8e5c-f512464a4a11-pJvC5U”版本“AWSCURRENT”未找到

跑步时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}'"

}

代码

主文件

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}'"

}

}

变量.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"

标签: bashamazon-web-servicessecurityterraformaws-secrets-manager

解决方案


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

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

即使您解决了上述更基本的问题,您的配置程序仍然可能会通过修改 Terraform 在同一运行中尝试管理的资源而使事情变得混乱。我不确定有没有办法解决这个问题,除非可能分成两个单独的操作。

更新:

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

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

注意:在 Terraform 0.12 及更早版本中,由于数据资源行为将读取延迟到应用阶段,当依赖于未知的值时,将 depends_on 与数据资源一起使用将强制读取始终延迟到应用阶段,因此,将depends_on 与数据资源一起使用的配置永远不会收敛。由于这种行为,我们不建议将depends_on 与数据资源一起使用。


推荐阅读