【问题标题】:Receiving error in AWS Secrets manager awscli for: Version "AWSCURRENT" not found when deployed via Terraform在 AWS Secrets Manager awscli 中收到错误:通过 Terraform 部署时未找到版本“AWSCURRENT”
【发布时间】:2021-01-08 23:37:38
【问题描述】:

概述

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

}

代码

ma​​in.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"

【问题讨论】:

    标签: bash amazon-web-services security terraform aws-secrets-manager


    【解决方案1】:

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

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

    即使您解决了上述更基本的问题,您的配置程序仍可能会因为修改 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 与数据资源一起使用将强制读取始终延迟到apply 阶段,因此将depends_on 与数据资源一起使用的配置永远不会收敛。由于这种行为,我们不建议将depends_on 与数据资源一起使用。

    【讨论】:

    • 谢谢!做到了!
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 2018-10-16
    • 2021-04-21
    • 2020-07-01
    • 2021-11-06
    • 2021-06-19
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多