【Terraform】terraform importを試す

## はじめに
以前、業務で`terraform import`コマンドを利用してAWSの既存インフラストラクチャをimportする機会があったので、知識定着のためにも記事にしてみたいと思います。

## `terraform import`とは？
既存のインフラストラクチャをTerraformの管理下に置くためのコマンドになります。

AWS上で変更した内容をTerraform上にも反映させる時に使用します。

## 前提
今回は事前に作成したこちらのTerraformのコードを利用しております。

https://github.com/masato930/ec2_create_code

こちらの記事でご紹介しているコードと同様のものになります。

https://qiita.com/masato930/items/7db361ad875b778a456a

Terraformのバージョン情報は、以下になります。

```zsh
% terraform --version
Terraform v1.1.8
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v4.22.0

Your version of Terraform is out of date! The latest version
is 1.2.5. You can update by downloading from https://www.terraform.io/downloads.html
%
```

## `terraform import`するための手順
今回は、試験用にAWSにS3を作成してimportしてみたいと思います。

### ①S3の作成
AWSに手動で以下の設定のS3を作成しておきます。
※S3の作成方法や説明については割愛とさせて頂きます。

|  設定項目  |  内容  | 備考  |
| ---- | ---- | ---- |
|  BucketName  | testbucket0717 | 設定 |
|  AWS Region  |  ap-northeast-1 | デフォルト |
| Object Ownership | ACLs disabled | デフォルト |
| Block Public Access settings for this bucket | Block all public access | デフォルト | 
| Bucket Versioning | Disabled | デフォルト |
| Tags | Key:Name<br>Value:testbucket| 設定 |
| Default encryption | Disable | デフォルト |

### ②`s3.tf`の作成
作業ディレクトリ(ec2_create_code)直下に以下の内容で`s3.tf`ファイルを作成します。
※この時点では、内容は空にしておきます。

```terraform:s3.tf
# ----------------------------------
# S3
# ----------------------------------
resource "aws_s3_bucket" "s3" {
}
```

### ③`terraform import`の実行
以下のコマンドを実行します。

```zsh:実行例
terraform import aws_s3_bucket.s3 バケット名
```

`Import successful!`が出力されたら問題なし。

```zsh:実行例
% terraform import aws_s3_bucket.s3 testbucket0717
aws_s3_bucket.s3: Importing from ID "testbucket0717"...
aws_s3_bucket.s3: Import prepared!
  Prepared aws_s3_bucket for import
aws_s3_bucket.s3: Refreshing state... [id=testbucket0717]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

%
```

実行すると、作業ディレクトリに`terraform.tfstate`が作成されます。
※`terraform.tfstate`は、管理対象のインフラストラクチャと構成に関する状態を保存するためのファイルになります。

```zsh:terraform.tfstate(一部省略)
{
  "version": 4,
  "terraform_version": "1.1.8",
  "serial": 70,
  "lineage": "*****************************",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "aws_s3_bucket",
      "name": "s3",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "acceleration_status": "",
            "acl": null,
            "arn": "arn:aws:s3:::testbucket0717",
            "bucket": "testbucket0717",
            "bucket_domain_name": "testbucket0717.s3.amazonaws.com",
            "bucket_prefix": null,
```

### ③`terraform plan`の実行
`terraform plan`を実行し、importされた内容が反映されていることを確認します。
※こちらのコマンドは、リソースに変更を加える前の確認で使用するコマンドであるため、何度実行しても問題ありません。

```terraform
  # aws_s3_bucket.s3 will be updated in-place
  ~ resource "aws_s3_bucket" "s3" {
      + force_destroy               = false
        id                          = "testbucket0717"
      ~ tags                        = {
          - "Name" = "testbucket" -> null
        }
      ~ tags_all                    = {
          - "Name" = "testbucket"
        } -> (known after apply)
        # (8 unchanged attributes hidden)


        # (2 unchanged blocks hidden)
    }
```

:::note warn
`s3.tf`ファイルについては変更されていないため、このまま apply を実行するとリソースが削除されてしまいます。
`terraform import`を実行しても、tfファイル自体は変更されません。
:::

### ④`s3.tf`の修正
`terraform.tfstate`を確認しながら、`s3.tf`を修正する。

```terraform:s3.tf
# ----------------------------------
# S3
# ----------------------------------
resource "aws_s3_bucket" "s3" {
  bucket = "testbucket0717"

  tags = {
    Name = "testbucket"
  }

  tags_all = {
    Name = "testbucket"
  }
}
```

### ⑤再度、`terraform plan`の実行
再度、`terraform plan`を実行し、変更箇所が存在しないことを確認。

実行結果で`No changes`が表示されていたら問題ありません。

```zsh
No changes. Your infrastructure matches the configuration.
```

## 参考
https://www.terraform.io/cli/import

https://www.terraform.io/cli/commands/import

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket

https://www.terraform.io/language/state