动态更改 terraform 资源的参数

Dynamically change the argument for the terraform resource

我有两组不同的帐户,其中创建了 kms 密钥。 kms 密钥创建是通过 ci pipeline 处理的,两组帐户都有不同的管道, 现在想将这两个管道合并为一个,因此所有资源创建都将来自单个 terraform 管道。

一组帐户在创建 kms 密钥时使用 name,而其他帐户使用 name_prefix

resource "aws_kms_alias" "backup_alias" {
  count         = var.create == true ? 1 : 0
  name = "alias/backup-key"
  name_prefix = "alias/${var.target_infra}-backup-key-"
  target_key_id = aws_kms_key.backup.0.key_id
}
resource "aws_kms_alias" "backup_alias" {
  count         = var.create == true ? 1 : 0
  name          = "alias/backup-key-"
  target_key_id = aws_kms_key.backup.0.key_id
}

我想为两个帐户保留相同的代码,因此考虑使用动态块,但它无济于事,因为它是块级别,而不是变量级别。

尝试如下操作:

resource "aws_kms_alias" "backup_alias" {
  count         = var.create == true ? 1 : 0
  #name          = var.is_lz == "enabled" ? "alias/${var.target_infra}-backup-key-" : "alias/backup-key"

  dynamic "name" {
    for_each = var.is_lz == "enabled" ? 0 : 1
    content {
      name = "alias/backup-key"
    }
  }

  dynamic "name_prefix" {
    for_each = var.is_lz == "enabled" ? 1 : 0
    content {
      name_prefix = "alias/${var.target_infra}-backup-key-"
    }
  }

  target_key_id = aws_kms_key.backup.0.key_id
}

但它不起作用。 有什么办法可以让两者都在同一个资源中吗?

您正在使用 01,就像您使用 count 一样。当您使用 for_each 时,您应该使用包含 0 或 1 个元素的列表。

resource "aws_kms_alias" "backup_alias" {
  count         = var.create == true ? ["1"] : []
  #name          = var.is_lz == "enabled" ? "alias/${var.target_infra}-backup-key-" : "alias/backup-key"

  dynamic "name" {
    for_each = var.is_lz == "enabled" ? [] : ["1"]
    content {
      name = "alias/backup-key"
    }
  }

  dynamic "name_prefix" {
    for_each = var.is_lz == "enabled" ? 1 : 0
    content {
      name_prefix = "alias/${var.target_infra}-backup-key-"
    }
  }

  target_key_id = aws_kms_key.backup.0.key_id
}