Как запустить EC в существующем VPC, используя Terraform

Мне нужно создать несколько новых EC2, RDS и т. Д. С использованием Terraform в существующем AWS VPC. и существующая подсеть, группа безопасности, iam и т. д. они не созданы Terraform. он создан вручную.

Я слышал, правильный путь - использовать импорт terraform (это правильно?). Чтобы проверить, как работает импорт terraform, я сначала проверил, как импортировать существующий EC2 вместо существующего VPC, потому что я не хочу ничего случайно изменять в существующем VPC.

перед запуском

terraform import aws_instance.example i-XXXXXXXXXX

Похоже, мне нужно создать очень подробный ресурс EC2 в моем файле ec2.tf, например:

resource "aws_instance" "example" {
  iam_instance_profile = XXXXXXXXXX
  instance_type = XXXXXXX
  ami = XXXXXXX
  tags {
    Name = XXXXX
    Department = XXXX
    ....
  }
} 

если я просто напишу:

resource "aws_instance" "example" {
}

это показало, что я пропустил ами и тип экземпляра,

если я напишу:

resource "aws_instance" "example" {
  instance_type = XXXXXXX
  ami = XXXXXXX
}

тогда запуск "terraform apply" изменит теги моего существующего EC2 на ничто, изменит профиль iam на ничто.

Я еще не пробовал, как импортировать существующий vpc, подсеть, группу безопасности. Я боюсь, если я попытаюсь, я должен поместить много информации о существующем vpc, подсети, группе безопасности и т. Д. Моя система сложна.

Ожидается ли, что мне нужно указать так много деталей в моем коде Terraform? Разве нет способа, чтобы я просто указал идентификатор существующего материала, например идентификатор vpc, и мой новый материал будет создан на основе существующего идентификатора? СТГ. лайк:

data "aws_subnet" "public" {
    id = XXXXXXX
}

resource "aws_instance" "example" {
  instance_type = "t2.micro"
  ami = "${var.master_ami}"
  ......
  subnet_id = "${aws_subnet.public.id}"
}

3 ответа

Решение

Вы можете оставить тело ресурса пустым во время импорта, но вам нужно будет вернуться назад и заполнить конкретные детали после его импорта. Вы можете просмотреть импортированный ресурс с помощью команды terraform show и заполнить все детали ресурса, поэтому при попытке запустить план terraform он не должен показывать никаких изменений.

Но, чтобы ответить на ваш вопрос, да, вы можете использовать существующие ресурсы без необходимости их импорта. Просто создайте файл переменных, в котором хранятся ваши существующие идентификаторы ресурсов, необходимые для новых ресурсов, а затем вы можете ссылаться на те, которые вам нужны.

Таким образом, вы можете получить файл.vars с чем-то вроде:

variable "ami_id" {
  description = "AMI ID"
  default = "ami-xxxxxxxx"
}

variable "subnet_prv1" {
  description = "Private Subnet 1"
  default = "subnet-xxxxxx"
}

Затем в вашем main.tf для создания ресурса:

resource "aws_instance" "example" {
   instance_type = "t2.micro"
   ami = "${var.ami_id}"
   ......
   subnet_id = "${var.subnet_prv1}"
}

Только один способ сделать это. Есть и другие, о которых вы можете прочитать в документации по terraform для переменных.

Просто используйте это со своими данными vpc

      resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

затем запустите cmd с существующим идентификатором vpc:

      $ terraform import aws_vpc.main VPC_ID

Для использования существующего VPC вы можете создать новую подсеть и определить диапазон IP-адресов для этой подсети. Например, для VPC с cdir 10.10.0.0/16 мы можем сделать следующее:

      resource "aws_subnet" "pre_exist_vpc" {
    vpc_id = "id_of_existing_vpc"
    cidr_block = "10.10.10.0/24"
}

resource "aws_instance" "test_ec2" {
    ami = "ami-033b95fb8079dc481"
    instance_type = "t2.micro"
    subnet_id = aws_subnet.exist_vpc.id
}

И второй вариант — с использованием существующей подсети необходимого VPC:

      resource "aws_instance" "test_ec2" {
    ami = "ami-033b95fb8079dc481"
    instance_type = "t2.micro"
    subnet_id = "id of existing subnet"
}
Другие вопросы по тегам