在Terraform中使用模块向ec2分配多个安全组时遇到错误

问题描述

这是我的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-ssrv.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(",0)},${element(split(",1)},2)},3)},4)},5)},6)},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(",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(",7)}"
  instance_name                 = "${element(split(",var.instance_name),7)}"
}

我在tfvars文件中的变量是:

security_group = "security_group_04_id@security_group_05_id@security_group_07_id"

现在我得到两种错误

  1. 错误属性值类型不正确
在资源“ aws_instance”“ ec2_instance”中的.... \\ xxxxxxxxxxxx \ ec2.tf第20行上

: 20:vpc_security_group_ids = [“ $ {element(split(” @“,var.security_group),0)}”“] | ---------------- | var.security_group是具有2个元素的元组

“ str”参数的值无效:必须输入字符串。

  1. 错误:启动源实例时出错:InvalidGroup.NotFound:VPC'vpc-016113bafe6694c18'中不存在安全组'sg-0a8a5220cf7ae4fff,sg-0d245af2b879c385d' 状态码:400,请求ID:291fda8a-7ec5-486b-b45b-9feb3bd9f7a3

请帮助我解决这些错误

解决方法

我不认为您在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列表。

我要进行野蛮猜测:以下可能是可能的问题。查看并尝试一下...。(显然,请检查Terraform计划是否符合您的期望)

1。)在main.tf中-删除中间的双引号,只留下一个逗号。 就像“,”->到,

  security_group                = ["${element(split(",0)},${element(split(",0)}"]
ec2.tf中的

2。)-用逗号替换@。 @没有道理。

vpc_security_group_ids = [“ $ {element(split(”,“,var.security_group),0)}”]

,

我在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}"]

这对我有用。