1

我正在尝试创建一组 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 模块依赖它?

4

2 回答 2

0

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

于 2019-01-04T19:39:55.427 回答
0

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

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

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

于 2019-01-08T16:50:39.677 回答