将不同的安全组附加到不同的 EC2
attaching different Security Groups to different EC2s
要求:-
我有多个 EC2 组(比如 2 组),其中每个组包含 6 个 EC2。而且我必须为每个组附加不同的 SG。
示例:-
Group1 包含:- Head1,child:EC2-1,EC2-2....6 并且需要附加 SG1
Group2 包含:- Head2,child:EC2-3,EC2-4 ...6 并且需要附加 SG2
我不想写单独的资源“aws_instance”
Head-Module
resource "aws_security_group" "sg" {
count = var.ec2_instance_count
name = "${local.account}${count.index}"
vpc_id = local.vpc_id
}
resource "aws_instance" "ec2_instance" {
count = var.ec2_instance_count
security_groups = [element(aws_security_group.sg.*.id, count.index)]
}
Child-Module:
data "aws_security_groups" "data_security_group" {
filter {
name = "group-name"
values = ["${local.account}${count.index}"]
}
}
resource "aws_instance" "ec2_child" {
count = var.ec2_instance_count*var.numberofchild
security_groups = [element(aws_security_group.data_security_group.*.id, count.index)]
}
错误:启动源实例时出错:InvalidGroup.NotFound:安全组'terraform-2020082
4151444795600000001' 在 VPC 中不存在 'vpc-ghhje85abcy'
状态码:400,请求id:9260fd88-a03a-4c46-b67c-3287594cdab5
在 main.tf 第 68 行,在资源“aws_instance”“ec2_instance”中:
68:资源“aws_instance”“ec2_instance”{
注意:我使用的是 data "aws_security_groups"
而不是 data "aws_security_group"
。如果我使用后一个,我知道我将只能在数据资源中获得一个 SG,它会抛出一个错误:多个安全组匹配;我从那里开始使用 data "aws_security_groups"
并且这个错误消失了。但我面临的最新错误是:InvalidGroup.NotFound 如上所述。
更新:我能够使用数据资源并且能够将不同的 SG 附加到不同的 EC2。唯一的问题是随机排序。对于第 1 组的所有 6 个 EC2,我希望他们分配第一个 SG 等等。
不要使用数据,而是像在 resource "aws_instance"
上那样使用计数来创建 resource "aws_security_group"
,这样您就可以直接引用它们...
resource "aws_security_group" "sg" {
count = var.ec2_instance_count
name = "${local.account}${count.index}"
vpc_id = local.vpc_id
}
resource "aws_instance" "ec2_instance" {
count = var.ec2_instance_count
security_groups = [element(aws_security_group.sg.*.id, count.index)]
}
谢谢 Helder,我创建了计数资源。它不是庞大的基础设施,而是一个相当复杂的基础设施。 8组(每组有1个Parent和6个child EC2)
所有家长都有 1 个外部 SG。每组 8 个内部 SG 1)。
我必须遵循一系列配置,因为要求将“父主机名”传递给“子用户数据”中的相应子组,因此我必须将它们保存在单独的模块中并使用“数据”资源进行重用。
父模块:
resource "aws_instance" "ec2_instance" {
count = tonumber(var.mycount)
vpc_security_group_ids = [data.aws_security_group.external_security_group.id, element(data.aws_security_group.internal_security_group.*.id, count.index)]
...
}
resource "aws_security_group" "internal_security_group" {
count = tonumber(var.mycount)
name = "${var.internalSGname}${count.index}"
}
resource "aws_security_group" "external_security_group" {
name = ${var.external_sg_name}"
}
ChildModule:具有数据资源并使用动态映射将 SG 分配给正确的 EC2 组。
data "aws_security_group" "internal_security_group" {
count = tonumber(var.mycount)
filter {
name = "group-name"
values = "${var.internalSGname}${count.index}"]
}
}
resource "aws_instance" "ec2_child" {
count = local.child_count * tonumber(var.mycount)
vpc_security_group_ids = ["${element(data.aws_security_group.internal_security_group.*.id, "${lookup(local.SG_lookup, count.index, 99)}")}"]
variable.tf
locals{
SG_lookup = {
for n in range(0, (local.child_count * tonumber(var.mycount))) :
n => "${floor(((n) / local.child_count))}"
}
}
}
要求:-
我有多个 EC2 组(比如 2 组),其中每个组包含 6 个 EC2。而且我必须为每个组附加不同的 SG。
示例:-
Group1 包含:- Head1,child:EC2-1,EC2-2....6 并且需要附加 SG1
Group2 包含:- Head2,child:EC2-3,EC2-4 ...6 并且需要附加 SG2
我不想写单独的资源“aws_instance” Head-Module
resource "aws_security_group" "sg" {
count = var.ec2_instance_count
name = "${local.account}${count.index}"
vpc_id = local.vpc_id
}
resource "aws_instance" "ec2_instance" {
count = var.ec2_instance_count
security_groups = [element(aws_security_group.sg.*.id, count.index)]
}
Child-Module:
data "aws_security_groups" "data_security_group" {
filter {
name = "group-name"
values = ["${local.account}${count.index}"]
}
}
resource "aws_instance" "ec2_child" {
count = var.ec2_instance_count*var.numberofchild
security_groups = [element(aws_security_group.data_security_group.*.id, count.index)]
}
错误:启动源实例时出错:InvalidGroup.NotFound:安全组'terraform-2020082 4151444795600000001' 在 VPC 中不存在 'vpc-ghhje85abcy' 状态码:400,请求id:9260fd88-a03a-4c46-b67c-3287594cdab5
在 main.tf 第 68 行,在资源“aws_instance”“ec2_instance”中: 68:资源“aws_instance”“ec2_instance”{
注意:我使用的是 data "aws_security_groups"
而不是 data "aws_security_group"
。如果我使用后一个,我知道我将只能在数据资源中获得一个 SG,它会抛出一个错误:多个安全组匹配;我从那里开始使用 data "aws_security_groups"
并且这个错误消失了。但我面临的最新错误是:InvalidGroup.NotFound 如上所述。
更新:我能够使用数据资源并且能够将不同的 SG 附加到不同的 EC2。唯一的问题是随机排序。对于第 1 组的所有 6 个 EC2,我希望他们分配第一个 SG 等等。
不要使用数据,而是像在 resource "aws_instance"
上那样使用计数来创建 resource "aws_security_group"
,这样您就可以直接引用它们...
resource "aws_security_group" "sg" {
count = var.ec2_instance_count
name = "${local.account}${count.index}"
vpc_id = local.vpc_id
}
resource "aws_instance" "ec2_instance" {
count = var.ec2_instance_count
security_groups = [element(aws_security_group.sg.*.id, count.index)]
}
谢谢 Helder,我创建了计数资源。它不是庞大的基础设施,而是一个相当复杂的基础设施。 8组(每组有1个Parent和6个child EC2) 所有家长都有 1 个外部 SG。每组 8 个内部 SG 1)。 我必须遵循一系列配置,因为要求将“父主机名”传递给“子用户数据”中的相应子组,因此我必须将它们保存在单独的模块中并使用“数据”资源进行重用。
父模块:
resource "aws_instance" "ec2_instance" {
count = tonumber(var.mycount)
vpc_security_group_ids = [data.aws_security_group.external_security_group.id, element(data.aws_security_group.internal_security_group.*.id, count.index)]
...
}
resource "aws_security_group" "internal_security_group" {
count = tonumber(var.mycount)
name = "${var.internalSGname}${count.index}"
}
resource "aws_security_group" "external_security_group" {
name = ${var.external_sg_name}"
}
ChildModule:具有数据资源并使用动态映射将 SG 分配给正确的 EC2 组。
data "aws_security_group" "internal_security_group" {
count = tonumber(var.mycount)
filter {
name = "group-name"
values = "${var.internalSGname}${count.index}"]
}
}
resource "aws_instance" "ec2_child" {
count = local.child_count * tonumber(var.mycount)
vpc_security_group_ids = ["${element(data.aws_security_group.internal_security_group.*.id, "${lookup(local.SG_lookup, count.index, 99)}")}"]
variable.tf
locals{
SG_lookup = {
for n in range(0, (local.child_count * tonumber(var.mycount))) :
n => "${floor(((n) / local.child_count))}"
}
}
}