Спасибо, Рик. оно работает. Итак, в итоге, если мне нужно изменить существующий vpc (который создается вручную) с помощью terraform, я должен сначала импортировать, но если я хочу создать новые компоненты из существующего vpc, я буду использовать второе решение, которое вы опубликовали. Спасибо.

ужно создать несколько новых 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}"
}

Ответы на вопрос(1)

Решение Вопроса

но вам нужно будет вернуться назад и заполнить конкретные детали после его импорта. Вы можете просмотреть импортированный ресурс с помощью команды 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 Docs для переменных

 user38995506 дек. 2017 г., 23:40
Спасибо, Рик. оно работает. Итак, в итоге, если мне нужно изменить существующий vpc (который создается вручную) с помощью terraform, я должен сначала импортировать, но если я хочу создать новые компоненты из существующего vpc, я буду использовать второе решение, которое вы опубликовали. Спасибо.

Ваш ответ на вопрос