我正在尝试创建一组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模块依赖它吗?
答案 0 :(得分:0)
如果要在子网组和群集之间建立一对多关系,则应将网络组件拆分为一个单独的模块,而不是redshift模块。
答案 1 :(得分:0)
在AWS上处理资源的最佳方法是按其生命周期和/或用途对其进行分组。我永远都不想在与应用程序服务器或资源相同的堆栈中创建数据库,因为这些服务器或资源可以在应用程序的生命周期中发生变化,但是数据库可能不会。
如果您的情况是正确的,则TF将创建资源(如果资源不存在),但您误解了上下文。如果状态文件(而不是AWS)中不存在它们,TF将创建它们。如果两个堆栈尝试创建具有相同名称的相同资源,则堆栈1将创建它们,堆栈2将尝试但失败,因为该资源已经存在于AWS中。
我将安全组和子网组分成各自的模块,然后使用数据源在Redshift模块中对其进行引用。