我需要在现有的AWS VPC中使用Terraform创建几个新的EC2,RDS等 . 它们不是Terraform创建的现有子网,安全组,iam等 . 它是手动创建的 .
我听说正确的方法是使用terraform导入(这是正确的吗?) . 为了测试terraform导入的工作原理,我首先测试了如何导入现有的EC2而不是现有的VPC,因为我不想在现有的VPC中意外更改任何内容 .
在跑步之前
terraform import aws_instance.example i-XXXXXXXXXX
看起来我需要在ec2.tf文件中创建一个非常详细的EC2资源,例如:
resource "aws_instance" "example" {
iam_instance_profile = XXXXXXXXXX
instance_type = XXXXXXX
ami = XXXXXXX
tags {
Name = XXXXX
Department = XXXX
....
}
}
如果我只是写:
resource "aws_instance" "example" {
}
它显示我错过了ami和实例类型,
如果我写:
resource "aws_instance" "example" {
instance_type = XXXXXXX
ami = XXXXXXX
}
然后运行“terraform apply”会将我现有EC2的标签更改为空,将iam配置文件更改为空 .
我还没有尝试过如何导入现有的vpc,子网,安全组 . 我担心如果我尝试,我必须提供现有的vpc,子网,安全组等的大量信息 . 我的系统很复杂 .
是否需要在我的terraform代码中指出这么多细节?是不是有办法,所以我只是简单地指出现有的东西的ID,如vpc的id,我的新东西将根据现有的id创建?某事 . 喜欢:
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计划时,它应显示不需要进行任何更改 .
但是,要回答您的问题,是的,您可以使用现有资源而无需导入它们 . 只需创建一个变量文件,其中包含新资源所需的现有资源ID,然后您可以引用所需的资源ID .
所以你可以有一个.vars文件,例如:
然后在你的main.tf中创建资源:
只是一种方法去做 . 还有其他一些,你可以在the terraform docs for variables阅读