如何告诉 Terraform 跳过秘密管理器资源(如果存在)?

waw*_*awa 12 amazon-web-services terraform terraform-provider-aws aws-secrets-manager

我的想法是,我想使用 Terraform 资源aws_secretsmanager_secret仅创建三个秘密(不是工作区指定的秘密),一个用于开发环境,一个用于 preprod,第三个用于生产环境。

就像是:

resource "aws_secretsmanager_secret" "dev_secret" {
  name = "example-secret-dev"
}

resource "aws_secretsmanager_secret" "preprod_secret" {
  name = "example-secret-preprod"
}

resource "aws_secretsmanager_secret" "prod_secret" {
  name = "example-secret-prod"
}

Run Code Online (Sandbox Code Playgroud)

但是创建它们之后,我不想每次运行“Terraform apply”时都覆盖它们,有没有办法告诉 Terraform 是否存在任何秘密,跳过秘密的创建并且不覆盖?

我查看了此页面,但仍然没有明确的解决方案,任何建议将不胜感激。

小智 9

您可以使用 Terraform为您生成随机秘密值

data "aws_secretsmanager_random_password" "dev_password" {
  password_length     = 16
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令创建秘密元数据

resource "aws_secretsmanager_secret" "dev_secret" {
  name                    = "dev-secret"
  recovery_window_in_days = 7
}
Run Code Online (Sandbox Code Playgroud)

然后创建秘密版本

resource "aws_secretsmanager_secret_version" "dev_sv" {
  secret_id     = aws_secretsmanager_secret.dev_secret.id
  secret_string = data.aws_secretsmanager_random_password.dev_password.random_password
  lifecycle {
    ignore_changes = [secret_string, ]
  }
}
Run Code Online (Sandbox Code Playgroud)

将“ignore_changes”生命周期块添加到机密版本将防止 Terraform 在创建机密后覆盖该机密。我刚才对此进行了测试,以确认将创建具有新随机值的新秘密,并且后续执行terraform apply不会覆盖该秘密。


Mar*_*cin 5

如果您在控制台中手动创建或使用 AWS SDK 创建密钥,它不会覆盖该密钥。它只aws_secretsmanager_secret创造了秘密,但没有创造它的价值。要设置值,您必须使用aws_secretsmanager_secret_version

无论如何,这是你可以轻松测试自己的东西。只需使用密钥运行代码,在 AWS 控制台中更新其值,然后重新运行 terraform apply 即可。您应该看到秘密值没有变化。