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

Mac*_*ers 6 amazon-ec2 amazon-web-services terraform

我正在尝试为给定的 VPC 获取PIV4_CIDR,使用 aws_vpcs 数据源首先识别 VPC 并从 ID 获取 CIDR - 这可能吗?

简单介绍一下背景,出于某些设计原因,我们在不同的 VPC 中提供服务。比如说。我有三个 VPC:xxxprod-nxxxprod-l并且xxxprod-h我想为整个子网添加 SG 规则以允许访问特定端口。这是我尝试过的:

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]}"
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

错误:不支持的属性

在 ../../modules/mgt/ec2.tf 第 42 行,资源“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会做类似的事情,但似乎不会。知道我该怎么做吗?

r4c*_*00n 7

至于今天,您不再需要使用列表方法,文档中没有指定它,但您可以执行以下操作:

data "aws_vpc" "main" {
  id = <your_vpc_id>
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以访问它data.aws_vpc.main.cidr_block,它没有在属性引用中指定,但它就在那里。

地形版本:1.0.11

AWS 提供商版本:4.9.0


Rya*_*Kim 2

您可以SET使用 data.aws_vpcs 获取(不是列表)vpc。(我认为该文档是错误的...)然后您可以使用data.aws_vpcs获取data.aws_vpc列表,并且可以获得它们的cidr块。

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]}"
}
Run Code Online (Sandbox Code Playgroud)