bash - 在 AWS Secrets Manager awscli 中收到错误:通过 Terraform 部署时未找到版本“AWSCURRENT”
问题描述
概述
- 创建 aws_secretsmanager_secret
- 创建 aws_secretsmanager_secret_version
- 将唯一生成的字符串存储为上述版本
- 使用 local-exec 供应商使用 bash 存储实际的安全字符串
- 在例如 RDS 实例部署中使用 secretsmanager 资源引用该字符串。
客观的
- 使所有纯文本字符串远离驻留在 S3 存储桶中的远程状态
- 使用 AWS Secrets Manager 存储这些字符串
- 设置一次,调用 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"
解决方案
该错误可能不会在您的配置程序执行本身中发生,因为如果您删除配置程序块,错误仍然会在应用时发生 - 但令人困惑的是只有在销毁后的第一次。删除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 与数据资源一起使用。
推荐阅读
- python - AWS CDK 日志记录 - cdk 部署后,我收到错误消息:props.destination.bind 不是函数
- azure - 如何通过 ARM 模板在 StorageAccount 中设置选定的网络
- html - HTML/CSS 需要帮助在两个元素之间创建下划线
- java - 在数据库的第一个添加新项目(位置 0)
- django - Django获取由外键标识的所有模型行
- azure - Windows 10 for Azure 上的 Windows Powershell 问题
- java - Spring websocket无法接收大数据
- html - Sticky header not working with resizable column in Primeng.?
- java - 如何关闭膨胀层?
- python - 错误 Python pandas:时间数据 '20160101-000000' 与格式 '%YYYY%mm%dd-%HH%MM%SS' 不匹配