使用terraform / terragrunt创建共享同一子网组和安全组的多个redshift集群

时间:2019-01-04 19:16:36

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

我正在尝试创建一组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}"]
}

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

2 个答案:

答案 0 :(得分:0)

如果要在子网组和群集之间建立一对多关系,则应将网络组件拆分为一个单独的模块,而不是redshift模块。

答案 1 :(得分:0)

在AWS上处理资源的最佳方法是按其生命周期和/或用途对其进行分组。我永远都不想在与应用程序服务器或资源相同的堆栈中创建数据库,因为这些服务器或资源可以在应用程序的生命周期中发生变化,但是数据库可能不会。

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

我将安全组和子网组分成各自的模块,然后使用数据源在Redshift模块中对其进行引用。