【问题标题】:Creating multiple RDS instances using Terraform count but with different Tags使用 Terraform 计数创建多个 RDS 实例,但具有不同的标签
【发布时间】:2019-07-09 16:46:42
【问题描述】:

我遇到了创建多个 RDS 实例的要求,所有 db 属性都保持不变。只是标签不同。我正在使用 Terraform 进行部署,并且 count 在这些情况下确实对我有帮助。但是有没有一种方法可以使用计数创建我的 RDS 实例,但标签应该不同。

代码:

resource "aws_db_instance" "rds-mysql" {
  count = "${var.RDS_INSTANCE["deploy"] == "true" ? 1 : 0}"
  allocated_storage           = "${var.RDS_INSTANCE[format("allocated_storage.%s",var.ENVIRONMENT)]}"
  auto_minor_version_upgrade  = true
  backup_retention_period     = "${var.RDS_INSTANCE[format("backup_retention_period.%s",var.ENVIRONMENT)]}"
  db_subnet_group_name        = "${aws_db_subnet_group.rds-mysql.id}"
  engine               = "${var.RDS_INSTANCE["engine"]}"
  final_snapshot_identifier = "${format("%s-%s-%s-rds-mysql-final-snapshot",var.PRODUCT,var.ENVIRONMENT,var.REGION_SHORT_NAME)}"
  engine_version       = "${var.RDS_INSTANCE["engine_version"]}"
  instance_class       = "${var.RDS_INSTANCE[format("instance_class.%s",var.ENVIRONMENT)]}"
  multi_az = "${var.RDS_INSTANCE[format("multi_az.%s",var.ENVIRONMENT)]}"
  parameter_group_name = "${aws_db_parameter_group.rds-mysql.id}"
  password = "${var.RDS_MASTER_USER_PASSWORD}"
  skip_final_snapshot = "${var.RDS_INSTANCE[format("skip_final_snapshot.%s",var.ENVIRONMENT)]}"
  storage_encrypted = "${var.RDS_INSTANCE[format("storage_encrypted.%s",var.ENVIRONMENT)]}"
  storage_type = "gp2"
  username = "${var.RDS_INSTANCE["username"]}"
  vpc_security_group_ids = ["${var.SG_RDS_MYSQL_ID}"]
  tags {
    Name = "${format("%s-%s-%s-rds-mysql",var.PRODUCT,var.ENVIRONMENT,var.REGION_SHORT_NAME)}"
    Project = "${format("%s-share",var.PRODUCT)}"
    Environment = "${var.ENVIRONMENT}"
  }
  #Resource lifecycle
    lifecycle {
        ignore_changes = ["allocated_storage","instance_class"]
  }
}

假设我部署了 2 个 RDS,以下是我希望我的标签看起来的样子:

#RDS 1

  tags {
    Name = "${format("%s-%s-%s-rds-mysql",var.PRODUCT1,var.ENVIRONMENT,var.REGION_SHORT_NAME)}"
    Project = "${format("%s-share",var.PRODUCT1)}"
    Environment = "${var.ENVIRONMENT}"
  }

#RDS2

  tags {
    Name = "${format("%s-%s-%s-rds-mysql",var.PRODUCT2,var.ENVIRONMENT,var.REGION_SHORT_NAME)}"
    Project = "${format("%s-share",var.PRODUCT2)}"
    Environment = "${var.ENVIRONMENT}"
  }  

请确认是否有任何方法可以实现。

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    上面的代码只会生成一个 RDS 或什么都不生成。你不能用它创建超过 2 个 RDS。

      count = "${var.RDS_INSTANCE["deploy"] == "true" ? 1 : 0}"
    

    而且我认为即使规格要求相同,也为了不同的目的使用“计数”创建多个 RDS 并不是一个好主意。例如,有 4 个 RDS,如果您想扩展其中一个 RDS。很难管理它。最好复制代码并多次粘贴。或者你可以为它创建模块。

    无论如何,您可以为每个 RDS 创建不同的标签,如下所示。 使列表变量(var.PRODUCT)并使用“元素”而不是 var.PRODUCT1 或 var.PRODUCT2

    variable "PRODUCT" {
      default = [
        "test1",
        "test2",
        "test3",
      ]
    }
    
    ...
      tags {
        Name = "${format("%s-%s-%s-rds-mysql", element(var.PRODUCT, count.index) ,var.ENVIRONMENT,var.REGION_SHORT_NAME)}"
        Project = "${format("%s-share", element(var.PRODUCT, count.index))}"
    ...
      }
    

    如果难以创建新的列表变量,则可以为其创建局部变量。

    locals {
      PRODUCT = ["${var.PRODUCT1}", "${var.PRODUCT2}", "${var.PRODUCT3}"]
    }
    
    ...
      tags {
        Name = "${format("%s-%s-%s-rds-mysql", element(local.PRODUCT, count.index) ,var.ENVIRONMENT,var.REGION_SHORT_NAME)}"
        Project = "${format("%s-share", element(local.PRODUCT, count.index))}"
    ...
      }
    
    

    【讨论】:

    • 抱歉不是我复制的更新代码。感谢 PRODUCT 的列表方法,但我将不得不用 0 代替 count.index 来更改我庞大的代码库 PRODUCT1。我的大部分代码都将使用PRODUCT1,除了 RDS。因此,我正在考虑可能会在变量文件中引入一个标志或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 2018-12-31
    • 2021-08-09
    • 2020-06-28
    • 1970-01-01
    • 2018-11-17
    • 2019-10-01
    • 2021-07-28
    相关资源
    最近更新 更多