把已创建的EC2实例纳入terraform管理
听说使用terraform import命令可以将现有资源导入terraform管理,所以决定挑战一下。这次我将在AWS的EC2上尝试。
提前准备
提前手动创建EC2实例。
接下来,我们需要记录实例ID、AMI ID和实例类型。(这是管理EC2实例所必需的terraform状态)



准备导入之前的工作
提供者信息的描述
为了导入指定的提供商,需要在用于管理terraform的目录中创建文件并写入提供程序信息。本次使用AWS,并指定东京地区。
EC2实例信息的内容
由於使用的資源是EC2,因此使用aws_instance。
在其中請記錄預先備份的AMI ID和實例類型。
包含供应商和EC2实例信息的文件如下所示。请根据您自己的环境对ami和instance_type进行相应的更改。
# プロバイダ情報
provider "aws" {
region = "ap-northeast-1"
}
# EC2インスタンス情報を記載
resource "aws_instance" "imported" {
ami = "ami-0f27d081df46f326c"
instance_type = "t2.micro"
}
导入执行
在目标目录中执行terraform init,以准备Terraform。
# terraform init
指定实例ID,并执行导入操作。
terraform import aws_instance.imported i-037fec03a06ff16c7
确认
这样导入就完成了。执行terraform plan,并确认没有差异就可以了。
# terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
aws_instance.imported: Refreshing state... [id=i-037fec03a06ff16c7]
------------------------------------------------------------------------
No changes. Infrastructure is up-to-date.
如果你担心是否已经被管理,那么请执行”terraform destroy”。正在被管理的EC2应该会被列为要删除的对象。
# terraform destroy
aws_instance.imported: Refreshing state... [id=i-037fec03a06ff16c7]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# aws_instance.imported will be destroyed
- resource "aws_instance" "imported" {
- ami = "ami-0f27d081df46f326c" -> null
<省略>
结束
我发现可以导入管理外的资源,所以实际尝试了一下。
顺便说一下,如果执行计划,即使不提前查询资源所需的参数,Terraform也会告诉你应该在配置文件中写哪些状态。
如果在执行计划时没有指定AMI,系统会弹出错误消息要求指定AMI。
# terraform plan
Error: Missing required argument
on main.tf line 5, in resource "aws_instance" "imported":
5: resource "aws_instance" "imported" {
The argument "ami" is required, but no definition was found.