【问题标题】:using terraform/terragrunt to create multiple redshift clusters sharing same subnet group and security group使用 terraform/terragrunt 创建多个共享相同子网组和安全组的 redshift 集群
【发布时间】:2019-05-31 08:52:51
【问题描述】:

我正在尝试创建一组 terraform/terragrunt 脚本来创建多个 Redshift 集群。我希望它们都共享相同的子网组和安全组,并且如果它们不存在则创建它们。我最初的尝试是创建一个模块“redshift”,定义如下:

data "aws_vpc" "default" {
  default = true
}

data "aws_subnet_ids" "default" {
  vpc_id      = "${data.aws_vpc.default.id}"
}

resource "aws_security_group" "default" {
  name        = "${var.redshift_security_group_name}"
  vpc_id      = "${data.aws_vpc.default.id}"
}

resource "aws_redshift_subnet_group" "default" {
  name       = "${var.redshift_subnet_group_name}"
  subnet_ids = ["${data.aws_subnet_ids.default.ids}"]
}

module "redshift" {
  source  = "terraform-aws-modules/redshift/aws"
  version = "1.4.0"

  cluster_identifier           = "${var.cluster_identifier}"
  cluster_database_name        = "${var.cluster_database_name}"
  cluster_node_type            = "${var.cluster_node_type}"
  cluster_master_password      = "${var.cluster_master_password}"
  cluster_master_username      = "${var.cluster_master_username}"
  vpc_security_group_ids       = ["${aws_security_group.default.id}"]
  preferred_maintenance_window = "${var.preferred_maintenance_window}"
  publicly_accessible          = "${var.publicly_accessible}"
  redshift_subnet_group_name   = "${var.redshift_subnet_group_name}"
  parameter_group_name         = "${var.parameter_group_name}"
  cluster_number_of_nodes      = "${var.cluster_number_of_nodes}"
  cluster_iam_roles            = ["${var.cluster_iam_roles}"]
  tags                         = ["${var.tags}"]
}

这适用于创建单个集群,当创建第二个集群时,terraform 无法识别安全组和子网组已经存在。处理这个问题的正确方法是什么?将网络设置分解为自己的模块,让 redshift 模块依赖它?

【问题讨论】:

    标签: amazon-redshift terraform amazon-vpc terraform-provider-aws terragrunt


    【解决方案1】:

    如果您想在子网组和集群之间建立一对多的关系,那么您应该将网络组件拆分到一个单独的模块中,而不是 redshift 模块。

    【讨论】:

    • 这越来越明显了。我错误地假设资源块的行为是“如果不存在则创建”。
    【解决方案2】:

    在 AWS 处理资源的最佳方式是按其生命周期和/或用途对其进行分组。我绝不希望在与应用程序服务器或资源相同的堆栈中创建数据库,因为它们可能会在应用程序的生命周期内发生变化,但数据库可能不会。

    如果您的情况是正确的,如果资源不存在,TF 将创建资源,但您误解了上下文。如果它们不存在于状态文件中,TF 将创建它们,而不是在 AWS 中。如果两个堆栈尝试创建具有相同名称的相同资源,堆栈 1 将创建它们,堆栈 2 将尝试但失败,因为资源已存在于 AWS。

    我会将安全组和子网组分离到它们自己的模块中,然后使用数据源在 Redshift 模块中引用它们。

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 2021-05-27
      • 2021-03-25
      • 2021-10-19
      • 2021-07-28
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多