在 AWS Secrets Manager awscli 中收到错误:通过 Terraform 部署时找不到版本 "AWSCURRENT"
Receiving error in AWS Secrets manager awscli for: Version "AWSCURRENT" not found when deployed via Terraform
概述
- 创建 aws_secretsmanager_secret
- 创建一个aws_secretsmanager_secret_version
- 将唯一生成的字符串存储为以上版本
- 使用 local-exec provisioner 存储实际的安全字符串 bash
- 在例如 RDS 实例部署中使用 secretsmanager 资源引用该字符串。
Objective
- 将所有纯文本字符串排除在驻留在 S3 存储桶中的远程状态之外
- 使用 AWS Secrets Manager 存储这些字符串
- 设置一次,调用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.
概述
- 创建 aws_secretsmanager_secret
- 创建一个aws_secretsmanager_secret_version
- 将唯一生成的字符串存储为以上版本
- 使用 local-exec provisioner 存储实际的安全字符串 bash
- 在例如 RDS 实例部署中使用 secretsmanager 资源引用该字符串。
Objective
- 将所有纯文本字符串排除在驻留在 S3 存储桶中的远程状态之外
- 使用 AWS Secrets Manager 存储这些字符串
- 设置一次,调用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.