Terraform: 如何从VPC id获取VPC CIDR?

6

我正在尝试使用aws_vpcs数据源来确定给定VPC的 PIV4_CIDR ,首先识别VPC并从ID获取CIDR-是否可能实现?

为了一些设计原因,我们将服务置于不同的VPC中。例如,我有三个VPC:xxxprod-nxxxprod-lxxxprod-h,我想添加一个安全组规则来允许整个子网访问特定端口。这是我尝试过的:

data "aws_vpcs" "prod" {
  tags = {
    Name = "${var.project}prd-*"
  }
}

resource "aws_security_group_rule" "pa-allow" {
  count             = length(data.aws_vpcs.prod.ids)
  type              = "ingress"
  from_port         = 8140
  to_port           = 8140
  protocol          = "tcp"
  cidr_blocks       = [sort(data.aws_vpcs.prod.ids)[count.index].cidr_block]
  security_group_id = aws_security_group.secg.id
  description       = "allow from ${sort(data.aws_vpcs.prod.ids)[count.index]}"
}

我遇到了错误:
``` Error: Unsupported attribute on ../../modules/mgt/ec2.tf line 42, in resource "aws_security_group_rule" "pa-allow": 42: cidr_blocks = [sort(data.aws_vpcs.prod.ids)[count.index].cidr_block] ```
这个值没有任何属性。
我试过了,但基于这个页面:https://www.terraform.io/docs/providers/aws/d/vpc.html,认为 aws_vpcaws_vpcs 可以做类似的事情,但看起来并不是这样。有什么建议如何解决?

我认为你不需要在这里使用 sort。而且,这看起来像是0.12的语法。这正确吗? - Matt Schuchard
@MattSchuchard,是的,那是0.12语法,我目前正在使用。我相信理论上语法是正确的,但可能不是正确的属性。 - MacUsers
@MattSchuchard,关于sort,事实上data.aws_vpcs.prod.ids是一个集合(set),而不是列表(list),因此其元素没有特定顺序,不能像列表那样通过数字索引来访问。我使用sort绕过了这个问题。 - MacUsers
如果我不使用排序,只有在使用排序时(例如“描述”参数),才能正常工作,否则会出现“记录集没有任何索引”的错误。文档可能使用“列表”一词作为通用术语? - MacUsers
我也有类似的想法,但是由于aws_vpc返回单个VPC的信息作为属性,我认为aws_vpcs列表元素可能会以类似的方式工作。那么下一个问题是,我该如何实现它。不一定非要使用aws_vpcs,只要能够检索相关的CIDR即可。 - MacUsers
显示剩余5条评论
2个回答

6

就目前而言,您不再需要使用列表方法,尽管文档中没有明确说明,但您可以像这样做:

data "aws_vpc" "main" {
  id = <your_vpc_id>
}

然后您可以访问它data.aws_vpc.main.cidr_block,它在属性参考中没有指定,但确实存在。

Terraform版本:1.0.11

AWS提供程序版本:4.9.0


2
你可以使用data.aws_vpcs获取VPC的SET(不是列表)。然后,您可以使用data.aws_vpcs获取data.aws_vpc列表,并获取它们的CIDR块。"Original Answer"翻译成"最初的回答"。
data "aws_vpcs" "prod" {
  tags = {
    Name = "${var.project}prd-*"
  }
}

data "aws_vpc" "prod" {
  count = length(data.aws_vpcs.prod.ids)
  id    = tolist(data.aws_vpcs.prod.ids)[count.index]
}

resource "aws_security_group_rule" "pa-allow" {
  count             = length(data.aws_vpcs.prod.ids)
  type              = "ingress"
  from_port         = 8140
  to_port           = 8140
  protocol          = "tcp"
  cidr_blocks       = [data.aws_vpc.prod[count.index].cidr_block]
  security_group_id = aws_security_group.secg.id
  description       = "allow from ${tolist(data.aws_vpcs.prod.ids)[count.index]}"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接