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

Posted

技术标签:

【中文标题】将安全组附加到我的 aws 实例的 Terraform 问题【英文标题】:Terraform issue attaching a security group to my aws instances 【发布时间】:2021-07-13 16:06:23 【问题描述】:

我对 terraform 还不够新,我认为我误解了 count 和 count.index 用法。

我正在使用 count 参数创建一些 EC2 实例,它工作正常

resource "aws_instance" "server" 
ami = data.aws_ami.app_ami.id
instance_type = "t2.micro"
key_name = "DeirdreKey"
subnet_id = aws_subnet.my_subnet_a.id
count = 2
tags = 
 Name = "server.$count.index"

我想将一个安全组与两个实例相关联,所以我创建了以下

resource "aws_network_interface_sg_attachment" "sg_attachment" 
security_group_id    = aws_security_group.allow_internet.id
network_interface_id = aws_instance.server.primary_network_interface_id

但是我遇到了这个错误

Error: Missing resource instance key

on lb.tf line 57, in resource "aws_network_interface_sg_attachment" "sg_attachment":
57:   network_interface_id = aws_instance.server.primary_network_interface_id

Because aws_instance.server has "count" set, its attributes must be
accessed on specific instances.

For example, to correlate with indices of a referring resource, use:
aws_instance.server[count.index]

我了解错误在抱怨什么。这是因为我所指的本地资源名称不是唯一的,因为我创建了 2 个称为“服务器”的 aws 实例。我不知道如何解决它。我尝试了以下

resource "aws_network_interface_sg_attachment" "sg_attachment" 
security_group_id    = aws_security_group.allow_internet.id
network_interface_id = aws_instance.server[count.index].primary_network_interface_id

然后我得到以下错误

Error: Reference to "count" in non-counted context

on lb.tf line 53, in resource "aws_network_interface_sg_attachment" "sg_attachment":
53:   network_interface_idaws_instance.server[count.index].primary_network_interface_id

The "count" object can only be used in "module", "resource", and "data"
blocks, and only when the "count" argument is set.

这是否意味着我必须将 count.index 引入本地资源名称?试了好几种方法都没有效果

resource "aws_instance" "server$count.index" 

【问题讨论】:

【参考方案1】:

您需要对资源的计数语句才能使用count.index。计数语句可能会失控,因此如果您有多个在逻辑上需要相同计数的资源,请使用变量或局部值:

local 
  replications = 2


resource "aws_instance" "server" 
  count = local.replications
  ami = data.aws_ami.app_ami.id
  instance_type = "t2.micro"
  key_name = "DeirdreKey"
  subnet_id = aws_subnet.my_subnet_a.id
  tags = 
    Name = "server.$count.index"
  


resource "aws_network_interface_sg_attachment" "sg_attachment" 
  count                = local.replications
  security_group_id    = aws_security_group.allow_internet.id
  network_interface_id = aws_instance.server[count.index].primary_network_interface_id

这会为每台服务器创建一个安全组附件,并为您提供可以引用为 aws_instance.server[0]aws_instance.server[1] 的服务器列表,以及可以以相同方式引用的附件列表。

【讨论】:

谢谢!现在更有意义了!

以上是关于将安全组附加到我的 aws 实例的 Terraform 问题的主要内容,如果未能解决你的问题,请参考以下文章

无法在AWS上向Active Directory添加实例

JClouds:如何将新卷附加到 AWS EC2 实例

在 AWS 上附加到我的 Web 根目录的额外文件夹

AWS 安全组难题

AWS - 静态 IP

如何使用 Terraform 附加或删除安全组的入口/出口规则?