![](/img/trans.png)
[英]Trying to use terraform to create multiple EC2 instances with separate route 53 records
[英]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.net
和var.priv_su.net
之間建立一對一的關系,這在我看來會簡化事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.