#amazon-web-services #terraform
#amazon-веб-сервисы #terraform
Вопрос:
Я думаю, что несколько человек задавали один и тот же вопрос, но мое состояние отличается. Я принимаю входные данные от пользователя для региона vpc, значение cidr даже для общедоступного сегмента подсети. Мне нужно подключить всю мою общедоступную подсеть к таблице маршрутов по умолчанию, а частные подсети — к таблице маршрутов diff . можете ли вы помочь мне в том, как их присоединить.
provider "aws" {
region = var.region
}
resource "aws_vpc" "app_vpc" {
cidr_block = var.vpc_cidr
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = var.vpc_name
}
}
# create igw
resource "aws_internet_gateway" "app_igw" {
vpc_id = aws_vpc.app_vpc.id
}
data "aws_availability_zones" "available" {
state = "available"
}
#provision public subnet
resource "aws_subnet" "public_subnet_01" {
vpc_id = aws_vpc.app_vpc.id
cidr_block = var.public_subnet_01
availability_zone = data.aws_availability_zones.available.names[0]
tags = {
Name = "public_subnet_01"
}
depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
resource "aws_subnet" "public_subnet_02" {
vpc_id = aws_vpc.app_vpc.id
cidr_block = var.public_subnet_02
availability_zone = data.aws_availability_zones.available.names[1]
tags = {
Name = "public_subnet_02"
}
depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
resource "aws_subnet" "public_subnet_03" {
vpc_id = aws_vpc.app_vpc.id
cidr_block = var.public_subnet_03
availability_zone = data.aws_availability_zones.available.names[2]
tags = {
Name = "public_subnet_03"
}
depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
#default route table
resource "aws_default_route_table" "default" {
default_route_table_id = aws_vpc.app_vpc.default_route_table_id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.app_igw.id
}
}
resource "aws_route_table_association" "default_association_01" {
subnet_id = [aws_subnet.public_subnet_01.id, aws_subnet.public_subnet_02.id, aws_subnet.public_subnet_03.id]
route_table_id = aws_vpc.app_vpc.default_route_table_id
}
Я получаю сообщение об ошибке при добавлении нескольких подсетей, поэтому, пожалуйста, помогите здесь 🙂
Комментарии:
1. Я не вижу, где в этом шаблоне определена закрытая таблица маршрутов.
Ответ №1:
aws_route_table_association принимает в качестве входных данных только одну подсеть, а не список подсетей.
Если вы хотите создать ассоциации, используя свой список, вы можете использовать for_each:
resource "aws_route_table_association" "default_association_01" {
for_each = toset([aws_subnet.public_subnet_01.id, aws_subnet.public_subnet_02.id, aws_subnet.public_subnet_03.id])
subnet_id = each.key
route_table_id = aws_vpc.app_vpc.default_route_table_id
}
Вышесказанное предполагает, что все остальное верно. В вашем коде все еще могут быть некоторые ошибки, которые пока не видны.
Комментарии:
1. Спасибо за ваш ответ, я получаю сообщение об ошибке ниже: значение «for_each» зависит от атрибутов ресурса, которые нельзя определить до применения, поэтому Terraform не может предсказать, сколько экземпляров будет создано. Чтобы обойти это, используйте аргумент -target, чтобы сначала применить только те ресурсы, от которых зависит for_each .
2. спасибо за всю помощь, но мой код работает нормально, если я объявляю ассоциацию с таблицей по-разному, но когда в for_each он выдает целевую ошибку: (
3. @AnkitSingh Если вы используете
for_each
один ресурс, обычно это влияет и на другие ресурсы, потому что сейчас вам приходится ссылатьсяaws_route_table_association
по-другому, чем раньше. Так, может быть, именно поэтому вы видите новые ошибки?