【问题标题】:For Each availability zone within an AWS region对于 AWS 区域内的每个可用区
【发布时间】:2020-11-28 06:21:50
【问题描述】:

我正在尝试使用 Terraform 在区域内的可用区内创建一个子网。我有以下代码,并且在让我的子网读取该区域的可用区时遇到了一些问题。以下也是我的错误。

data "aws_availability_zones" "azs" {
  state = "available"
}
locals {
  az_names = data.aws_availability_zones.azs.names
}

resource "aws_vpc" "main" {
  for_each   = var.environment
  cidr_block = var.vpc_cidr

  tags = {
    Name = var.vpc_tags
  }
}

resource "aws_subnet" "public" {
  for_each                = var.public_sub_cidr
  vpc_id                  = aws_vpc.main[each.key].id
  cidr_block              = cidrsubnet(var.vpc_cidr, 0, each.value.public_subnet)
  availability_zone       = local.az_names[each.key]
  map_public_ip_on_launch = true
  tags = {
    Name = "${var.vpc_tags}-PubSubnet"
  }
}

错误

Error: Unsupported attribute



on vpc.tf line 17, in resource "aws_subnet" "public":
  17:   cidr_block              = cidrsubnet(var.vpc_cidr, 0, each.value.public_subnet)
    |----------------
    | each.value is ""

This value does not have any attributes.

Error: Invalid index



on vpc.tf line 18, in resource "aws_subnet" "public":
  18:   availability_zone       = local.az_names[each.key]
    |----------------
    | each.key is ""
    | local.az_names is list of string with 3 elements

The given key does not identify an element in this collection value: a number
is required.

任何关于从可用区读取以及分配这些公共子网的建议都将不胜感激。

更新 我取得了一些进展,更新了我的代码以使用我的数据资源的“长度”。请参阅下面的代码和错误:

resource "aws_subnet" "public" {
  for_each                = length(local.az_names)
  vpc_id                  = aws_vpc.tableau[each.key].id
  cidr_block              = cidrsubnet(var.vpc_cidr, 8, each.value)
  availability_zone       = local.az_names[each.key]
  map_public_ip_on_launch = true
  tags = {
    Name = "${var.vpc_tags}-PubSubnet"
  }
}
Error: Invalid for_each argument



 on vpc.tf line 15, in resource "aws_subnet" "public":
  15:   for_each                = length(local.az_names)

The given "for_each" argument value is unsuitable: the "for_each" argument
must be a map, or set of strings, and you have provided a value of type
number.

make: *** [apply] Error 1

【问题讨论】:

    标签: amazon-web-services terraform amazon-vpc subnet cidr


    【解决方案1】:

    不确定您要达到什么目的,但这是不正确的:

    for_each                = length(local.az_names)
    

    应该是:

    for_each                = toset(local.az_names)
    

    由于现在设置了local.az_names,因此您只能使用each.keyeach.value 将与each.key 相同)。例如:

    availability_zone       = each.key
    

    以下代码在每个 AZ 中创建一个子网:

    provider "aws" {
      # your details
    }
    
    data "aws_availability_zones" "azs" {
      state = "available"
    }
    
    locals {
      az_names = data.aws_availability_zones.azs.names
    }
    
    variable "vpc_cidr" {
      default = "10.0.0.0/16"
    }
    
    resource "aws_vpc" "main" {
      cidr_block = var.vpc_cidr
    }
    
    resource "aws_subnet" "public" {
      for_each                = {for idx, az_name in local.az_names: idx => az_name}
      vpc_id                  = aws_vpc.main.id
      cidr_block              = cidrsubnet(var.vpc_cidr, 8, each.key)
      availability_zone       = local.az_names[each.key]
      map_public_ip_on_launch = true
    }
    

    【讨论】:

    • 谢谢@Marcin。我要做的是为 aws 区域内的每个可用性创建一个子网。我在将 cidr 块附加到公共子网时遇到了一些麻烦。我正在使用 cidrsubnet 函数以动态附加此值,但在处理 for_each 时不确定如何执行此操作
    • @DaveMichaels 你好。我添加了一个代码,该代码通过示例在每个可用 AZ 中正确创建了一个子网。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2019-06-08
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2015-05-27
    • 2020-12-11
    相关资源
    最近更新 更多