Импорт ресурсов без принудительного создания новых

#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

 

Подробнее читайте здесь: