Как запретить Terraform удалить импортированный ресурс?

Я новичок в Terraform, поэтому я уверен, что что-то упускаю, но ответы, которые я нахожу, похоже, не задают тот же вопрос, что и я.

У меня есть группа AWS VPC / Security, в которой нам нужно создать наши экземпляры EC2, и этот VPC / SG уже создан. Чтобы создать экземпляр EC2, Terraform требует, чтобы, если у меня нет VPC по умолчанию, я должен был импортировать свой собственный. Но как только я импортирую и применяю свой план, когда я хочу его уничтожить, он пытается уничтожить и мой VPC. Как мне инкапсулировать свои ресурсы, чтобы при запуске «terraform apply» я мог создать экземпляр EC2 с моим импортированным VPC, но когда я запускаю «terraform destroy», я уничтожаю только свой экземпляр EC2?

Если кто-то хочет упомянуть, я понимаю, что:

lifecycle = {
    prevent_destroy = true
}

это не то, что я ищу.

Вот мой текущий практический код.

resource "aws_vpc" "my_vpc" {
  cidr_block = "xx.xx.xx.xx/24"
}

provider "aws" {
  region = "us-west-2"
}


data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*"]
  }

  owners = ["099720109477"] # Canonical
}


resource "aws_instance" "web" {

  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t3.nano"

  vpc_security_group_ids = ["sg-0e27d851dxxxxxxxxxx"]
  subnet_id              = "subnet-0755c2exxxxxxxx"

  tags = {
    Name = "HelloWorld"
  }
}

person Jacob C    schedule 04.10.2019    source источник
comment
Похоже, что вы действительно хотите, чтобы ваша конфигурация Terraform знала о VPC, но не управляла им активно. Это верно? В противном случае я предполагаю, что вы хотите управлять VPC, но не допустите его уничтожения.   -  person Matt Schuchard    schedule 04.10.2019
comment
Правильно, исходя из вашего первого предположения. Я хочу разместить свой экземпляр EC2 в моем предварительно созданном VPC не по умолчанию, но не иметь этот VPC под управлением Terraform.   -  person Jacob C    schedule 05.10.2019


Ответы (2)


Terraform не должен требовать от вас развертывания или импорта VPC для развертывания в нем экземпляра EC2. Вы должны иметь возможность ссылаться на VPC, подсети и группы безопасности по идентификатору, чтобы TF знал о вашей существующей сетевой инфраструктуре так же, как вы это уже сделали для SG и подсетей. Все, что вам нужно для развертывания экземпляра EC2 "aws_instance", - это присвоить ему существующий идентификатор подсети в существующем VPC, как вы уже сделали. Почему вы говорите, что Terraform требует развертывание или импорт VPC? Какая ошибка или проблема возникает при развертывании без VPC и просто с использованием существующего?

Вы можете защитить VPC через AWS, если действительно хотите, но я не думаю, что вы действительно хотите импортировать VPC в свое состояние Terraform и позволить Terraform управлять им здесь. Похоже, вы хотите, чтобы VPC обслуживал другие ресурсы, возможно, приложения, развернутые вручную или через другие стеки TF, и чтобы VPC работал независимо от любого развертывания приложений.

person Dude0001    schedule 04.10.2019
comment
Я удалил импортированный VPC, и он все еще работал. Похоже, что полученная мной ошибка (ошибка 400 нет VPC по умолчанию) возникла из-за того, что я не включил vpc_security_group_ids и subnet_id. Я добавил их только после тестирования, когда импортировал свой VPC. У меня всегда было решение. Спасибо! - person Jacob C; 05.10.2019

Чтобы ответить на исходный вопрос, вы можете использовать источник данных и сопоставить свой VPC по идентификатору или имени тега:

data "aws_vpc" "main" {
  tags = {
    Name = "main_vpc"
  }
}

Or

data "aws_vpc" "main" {
  id = "vpc-nnnnnnnn"
}

Затем обратитесь к нему с помощью: data.aws_vpc.main

Кроме того, если вы уже включили свой VPC, но не хотите его уничтожать при удалении из своего состояния, вы можете сделать это с помощью команды terraform state: https://www.terraform.io/docs/commands/state/index.html

person nfroidure    schedule 12.08.2020