把已创建的EC2实例纳入terraform管理

听说使用terraform import命令可以将现有资源导入terraform管理,所以决定挑战一下。这次我将在AWS的EC2上尝试。

提前准备

提前手动创建EC2实例。

接下来,我们需要记录实例ID、AMI ID和实例类型。(这是管理EC2实例所必需的terraform状态)

image.png
image.png
image.png

准备导入之前的工作

提供者信息的描述

为了导入指定的提供商,需要在用于管理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.
bannerAds