#amazon-web-services #terraform #terraform-provider-aws
Вопрос:
Я пытаюсь восстановить состояние для учетной записи AWS, настроенной с помощью terraform. Я запустил ‘terraform import’ с моим модулем и могу получить состояние для нескольких aws_subnets, но когда я запускаю ‘terraform plan’, он по-прежнему пытается принудительно уничтожить существующие подсети и воссоздать их.
Вот как выглядит моя terraform
resource "aws_subnet" "instance_subnets" {
for_each = { for idx, subnet in keys(var.subnets) : idx => { name = subnet
cidr = var.subnets[subnet] } }
cidr_block = each.value.cidr
vpc_id = aws_vpc.vpc.id
availability_zone = element(data.aws_availability_zones.available.names, each.key)
tags = {
Name = each.value.name
}
}
Мой terraform.tf
variable "subnets" {
type = map(string)
default = {
"Public" : "10.10.0.0/24"
"Private" : "10.10.1.0/24"
}
Вывод плана терраформирования
# module.mymodule.aws_subnet.subnets will be destroyed
- resource "aws_subnet" "subnets" {
- arn = "arn:aws:ec2:eu-west-2:0xxxxxxxxxxxxx:subnet/subnet-0000xxxxx" -> null
- assign_ipv6_address_on_creation = false -> null
- availability_zone = "eu-west-2a" -> null
- availability_zone_id = "euw2-az2" -> null
- cidr_block = "10.10.0.0/24" -> null
- id = "subnet-0000xxxxx" -> null
- map_customer_owned_ip_on_launch = false -> null
- map_public_ip_on_launch = false -> null
- owner_id = "0xxxxxxxxxxxxx" -> null
- tags = {
- "Name" = "Public"
} -> null
- tags_all = {
- "Name" = "Public"
} -> null
- vpc_id = "vpc-0000xxxxxxx" -> null
- timeouts {}
}
# module.mymodule.aws_subnet.subnets[1] will be destroyed
- resource "aws_subnet" "subnets" {
- arn = "arn:aws:ec2:eu-west-2:0xxxxxxxxxxxxx:subnet/subnet-0000xxxxx" -> null
- assign_ipv6_address_on_creation = false -> null
- availability_zone = "eu-west-2b" -> null
- availability_zone_id = "euw2-az3" -> null
- cidr_block = "10.10.1.0/24" -> null
- id = "subnet-0000xxxxx" -> null
- map_customer_owned_ip_on_launch = false -> null
- map_public_ip_on_launch = false -> null
- owner_id = "0xxxxxxxxxxxxx" -> null
- tags = {
- "Name" = "Private"
} -> null
- tags_all = {
- "Name" = "Private"
} -> null
- vpc_id = "vpc-0000xxxxxxx" -> null
- timeouts {}
}
# module.mymodule.aws_subnet.subnets["0"] will be created
resource "aws_subnet" "subnets" {
arn = (known after apply)
assign_ipv6_address_on_creation = false
availability_zone = "eu-west-2a"
availability_zone_id = (known after apply)
cidr_block = "10.10.0.0/24"
id = (known after apply)
ipv6_cidr_block_association_id = (known after apply)
map_public_ip_on_launch = false
owner_id = (known after apply)
tags = {
"Name" = "Public"
}
tags_all = {
"Name" = "Public"
}
vpc_id = "vpc-0000xxxxxxx"
}
# module.mymodule.aws_subnet.subnets["1"] will be created
resource "aws_subnet" "subnets" {
arn = (known after apply)
assign_ipv6_address_on_creation = false
availability_zone = "eu-west-2b"
availability_zone_id = (known after apply)
cidr_block = "10.10.1.0/24"
id = (known after apply)
ipv6_cidr_block_association_id = (known after apply)
map_public_ip_on_launch = false
owner_id = (known after apply)
tags = {
"Name" = "Private"
}
tags_all = {
"Name" = "Private"
}
vpc_id = "vpc-0000xxxxxxx"
}
У меня есть экземпляры ec2, которые не могут быть завершены в каждой подсети, поэтому они не могут быть уничтожены и воссозданы заново. Возможно ли импортировать их таким образом, чтобы я мог использовать файл состояния как есть?
Ответ №1:
Используемый индекс — это for_each
индекс переменной длины подсетей, в обычном for_each
режиме вы должны использовать индекс имени:
for_each = var.subnets
Затем импортируйте с индексом имени:
terraform import module.mymodule.aws_subnet.subnets["private"] SUBNET_ID
terraform import module.mymodule.aws_subnet.subnets["public"] SUBNET_ID
Подробнее читайте здесь: