在 terraform 中使用模块将多个安全组分配给 ec2 时出错
Posted
技术标签:
【中文标题】在 terraform 中使用模块将多个安全组分配给 ec2 时出错【英文标题】:Getting error while assigning multiple security group using modules to ec2 in terraform 【发布时间】:2021-01-07 00:17:36 【问题描述】:这是我的 ec2.tf
resource "aws_instance" "ec2_instance"
# resource gets created if private_ip variable is not passed as a input.
count = var.instance_count
//"$length(compact(split(",", var.instance_count))) > 0 ? "$var.instance_count" : 0"
ami = "$element(split(",", var.ami_id), count.index)"
instance_type = "$element(split(",", var.instance_type), count.index)"
subnet_id = "$element(split("," ,var.subnet),count.index)"
key_name = "$aws_key_pair.tmnl-infra-s-s-rv.key_name"
associate_public_ip_address = "$var.associate_public_ip"
disable_api_termination = "$var.disable_termination"
vpc_security_group_ids = ["$element(split("@", var.security_group), 0)"]
iam_instance_profile = "$element(split(",", var.iam_instance_profile), count.index)"
ebs_optimized = "$element(split(",", var.ebs_optimized), count.index)"
这是 main.tf 中 EC2 的模块
module "ec2"
source = "../../euc-terraformcontrol-compute"
ami_id = "$element(split(",", var.ami_id), 0),$element(split(",", var.ami_id), 1),$element(split(",", var.ami_id), 2),$element(split(",", var.ami_id), 3),$element(split(",", var.ami_id), 4),$element(split(",", var.ami_id), 5),$element(split(",", var.ami_id), 6),$element(split(",", var.ami_id), 7)"
instance_count = "$element(split(",", var.instance_count), 0)"
root_volume_size = "$element(split(",", var.root_volume_size),0)"
subnet = "subnet-0be87b3442158715d,subnet-0cd01502c1a6f37d9,subnet-06785e23087afb9a6"
iam_instance_profile = "$element(split(",", var.iam_instance_profile),0)"
#if multiple security group should be attached to each instance then the format will be "$var.sg1,$var.sg2,$var.sg3,$var.sg4"
security_group = ["$element(split(",", module.security_groups.security_group_05_id),0)","$element(split(",", module.security_groups.security_group_06_id),0)"]
instance_type = "$element(split(",", var.instance_type), 0),$element(split(",", var.instance_type), 1),$element(split(",", var.instance_type), 2),$element(split(",", var.instance_type), 3),$element(split(",", var.instance_type), 4),$element(split(",", var.instance_type), 5),$element(split(",", var.instance_type), 6),$element(split(",", var.instance_type), 7)"
instance_name = "$element(split(",", var.instance_name), 0),$element(split(",", var.instance_name), 1),$element(split(",", var.instance_name), 2),$element(split(",", var.instance_name), 3),$element(split(",", var.instance_name), 4),$element(split(",", var.instance_name), 5),$element(split(",", var.instance_name), 6),$element(split(",", var.instance_name), 7)"
我在 tfvars 文件中的变量是:
security_group = "security_group_04_id@security_group_05_id@security_group_07_id"
现在我得到了两种类型的错误:
-
错误:属性值类型不正确
在 ....\xxxxxxxxxxxx\ec2.tf 第 20 行,在资源“aws_instance”“ec2_instance”中: 20: vpc_security_group_ids = ["$element(split("@", var.security_group), 0)"] |---------------- | var.security_group 是包含 2 个元素的元组
“str”参数的值无效:需要字符串。
-
错误:启动源实例时出错:InvalidGroup.NotFound:VPC 'vpc-016113bafe6694c18' 中不存在安全组'sg-0a8a5220cf7ae4fff,sg-0d245af2b879c385d'
状态码:400,请求ID:291fda8a-7ec5-486b-b45b-9feb3bd9f7a3
请帮我解决这些错误。
【问题讨论】:
您确定security_group
是您认为的那样吗?错误消息说它的元组,而不是字符串。
【参考方案1】:
我认为您在 tfvars 中定义的值没有被使用。
ec2.tf 模块从 main.tf 中的这一行获取值
security_group = ["$element(split(",", module.security_groups.security_group_05_id),0)","$element(split(",", module.security_groups.security_group_06_id),0)"]
这看起来像一个安全组 ID 列表。您将此列表作为“var.security_group”传递给模块。显然,SPLIT 函数会抛出一个错误,因为它需要一个字符串。所以你看到的错误是预期的。
vpc_security_group_ids = ["$element(split("@", var.security_group), 0)"]
很难进一步指出这里的问题是什么。此代码不起作用。如果您的 TF 配置文件以前工作过,我猜最近有一个更改破坏了这一点 - 请查看该代码更改。
要求很简单。 vpc_security_group_ids 需要一个有效安全组 ID 的列表。
我要做一个Wild Guess:以下可能是可能的问题。查看并尝试一下....(显然,请检查 Terraform 计划是否符合您的期望)
1.) in main.tf -- 去掉中间的双引号,只留下一个逗号。 像 "," --> 到只是 ,
security_group = ["$element(split(",", module.security_groups.security_group_05_id),0),$element(split(",", module.security_groups.security_group_06_id),0)"]
2.) in ec2.tf -- 将 @ 替换为逗号。 @ 没有意义。
vpc_security_group_ids = ["$element(split(",", var.security_group), 0)"]
【讨论】:
【参考方案2】:我在 ec2.tf 中进行了此更改
vpc_security_group_ids = "$var.security_group"
我在 main.tf 中更改了这个
security_group =["$module.security_groups.security_group_04_id", "$module.security_groups.security_group_05_id"]
这对我有用。
【讨论】:
以上是关于在 terraform 中使用模块将多个安全组分配给 ec2 时出错的主要内容,如果未能解决你的问题,请参考以下文章
使用 terraform/terragrunt 创建多个共享相同子网组和安全组的 redshift 集群
如何使用 Terraform 在管理组范围上定义和分配 Azure 策略?