簡體   English   中英

使用每個 terraform 在單獨的 AZ 中創建不同的 EC2 實例

[英]Creating different EC2 instances in separate AZs using for each terraform

我正在嘗試使用 terraform 在單獨的 AZ 中部署不同的 EC2 實例。然后我將 EC2 實例所在的 su.net 關聯到帶有 NAT 網關的路由表。 我在將 su.nets 與路由表上的 nat 網關相關聯時遇到了困難。 以下是我的代碼和錯誤。 任何意見將是有益的。

resource "aws_instance" "private" {
  for_each      = var.priv_subnet
  ami           = var.ec2_amis[var.region]
  instance_type = each.key
  key_name      = aws_key_pair.main.key_name
  subnet_id     = aws_subnet.private[each.key].id

  tags = {
    Name = each.value.tag
  }
}

resource "aws_route_table" "nat" {
  for_each = var.pub_subnet
  vpc_id   = aws_vpc.main.id

  route {
    cidr_block     = "0.0.0.0/0"
    nat_gateway_id = aws_nat_gateway.main[each.key].id
  }

  tags = {
    Name = "${var.vpc_tags}_${each.key}_PrivRT"
  }
}

resource "aws_route_table_association" "nat" {
  for_each       = aws_subnet.private
  route_table_id = aws_route_table.nat[each.key].id
  subnet_id      = each.value.id
}
resource "aws_subnet" "private" {
  for_each                = var.priv_subnet
  vpc_id                  = aws_vpc.tableau.id
  cidr_block              = cidrsubnet(aws_vpc.main.cidr_block, 8, each.value.subnet)
  availability_zone       = each.value.availability_zone
  map_public_ip_on_launch = false
  tags = {
    Name = "PrivSub-${each.value.availability_zone}"
  }
}

resource "aws_eip" "main" {
  for_each = aws_subnet.public
  vpc      = true

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_nat_gateway" "tableau" {
  for_each      = aws_subnet.public
  subnet_id     = each.value.id
  allocation_id = aws_eip.main[each.key].id
}

resource "aws_subnet" "public" {
  for_each                = var.pub_subnet
  vpc_id                  = aws_vpc.main.id
  cidr_block              = cidrsubnet(aws_vpc.main.cidr_block, 8, each.value)
  availability_zone       = each.key
  map_public_ip_on_launch = true
  tags = {
    Name = "PubSub-${each.key}"
  }
}

變量

variable "priv_subnet" {


 type = map(object({
    availability_zone = string
    subnet            = string
    tag               = string
  }))
  default = {
    "m5.2xlarge" = {
      availability_zone = "us-west-2a"
      subnet            = 4
      tag               = "Primary"
    }
    "m5.4xlarge" = {
      availability_zone = "us-west-2b"
      subnet            = 5
      tag               = "Worker1"
    }
    "m5.4xlarge" = {
      availability_zone = "us-west-2c"
      subnet            = 6
      tag               = "Worker2"
    }
  }
}

variable "pub_subnet" {
  default = {
    "us-west-2a" = 1
    "us-west-2b" = 2
    "us-west-2c" = 3
  }
}

錯誤

Error: Invalid index

  on vpc.tf line 99, in resource "aws_route_table_association" "nat":
  99:   route_table_id = aws_route_table.nat[each.key].id
    |----------------
    | aws_route_table.nat is object with 3 attributes
    | each.key is "m5.2xlarge"

The given key does not identify an element in this collection value.


Error: Invalid index

  on vpc.tf line 99, in resource "aws_route_table_association" "nat":
  99:   route_table_id = aws_route_table.nat[each.key].id
    |----------------
    | aws_route_table.nat is object with 3 attributes
    | each.key is "m5.4xlarge"

The given key does not identify an element in this collection value.

我理解錯誤消息,但不確定如何將路由適當地分配給該路由表。

each.key中的aws_route_table_association將是來自priv_su.net的實例類型,例如m5.2xlarge 但是, aws_route_table.nat鍵將是 AZ 名稱,例如來自var.pub_su.net us-east-1a

顯然,這是行不通的。 解決此問題的一種方法是修改priv_su.net變量以使用 su.net 名稱作為鍵,而不是實例類型。 更改可能需要進一步更改您的代碼。

variable "priv_subnet" {

 type = map(object({
    instance_type     = string
    subnet            = string
    tag               = string
  }))

  default = {
    "us-west-2a" = {
      instance_type = "m5.2xlarge"
      subnet            = 4
      tag               = "Primary"
    }
    "us-west-2b" = {
      instance_type     = "m5.4xlarge"
      subnet            = 5
      tag               = "Worker1"
    }
    "us-west-2c" = {
      instance_type     = "m5.4xlarge"
      subnet            = 6
      tag               = "Worker2"
    }
  }
}

這樣你就會在var.pub_su.netvar.priv_su.net之間建立一對一的關系,這在我看來會簡化事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM