在 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章

获取 AWS 安全组 Terraform 模块的 ID

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

如何使用 Terraform 在管理组范围上定义和分配 Azure 策略?

使用 Terraform (AWS) 将安全组添加到另一个安全组的入站规则作为源

如何使用 terraform 在多个区域进行设置?

将安全组附加到我的 aws 实例的 Terraform 问题