初めてTerraform Import をやってみた！AWS/CloudFront

## Terraformとは

HashiCorp社が開発しているインフラストラクチャ定義ツールです。

詳しくはこちら↓
https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73#terraform-%E3%81%A8%E3%81%AF

## Terraform Importとは

Terraform Importを使うと、既にあるインフラリソースをTerraformにインポートできます。
他の方法で作成したリソースを、Terraformの管理下に置くことができます。

## Terraform Import Command の使い方

Usage: ```terraform import [options] ADDRESS ID```

2019/10/09 時点では、一度に1つのリソースのみをインポートできます。
例えば、AWS VPCなど、一つのくくりを対象に全部のリソースを一度にインポートすることはできないということです。
Terraformの将来のバージョンで改善される予定だそうです！

■ファイルの作成

まずはファイルを作成して、入れ物、枠だけ作って上げるイメージです。
ファイル名は instance.tf 等、リソースの種類毎にわけてつけてあげると、わかりやすいと思います！

```
resource "aws_instance" "example" {
}
```

■importコマンド使用例
リソースタイプ"aws_instance"、リソースネーム"example"に加えて、インポートしたいインスタンスのIDをつけることでインポートできます！

```
$ terraform import aws_instance.example i-abcd1234
```

stateファイルに、対象のリソースがインポートされます。
terraform plan を実行してコードとリソースの差分を確認して、手動でファイルを修正していきます。
実際にやってみたものをこれから紹介していきます！

## Terraform ImportでCloudFrontのリソースをImportしてみた

terraform version:v0.12.7
provider aws version : ~> 2.14.0
投稿日:2019/10/09

これ以降は、terraformを利用している前提になります！

今回は下記のような既にあるCloudFrontのリソースをimportしていきたいと思います！
リソースネームとIDは適宜置き換えてください。

リソースタイプ:aws_cloudfront_distribution（CloudFront）
リソースネーム:example
CloudFrontのID:XXXXXXXXXXXXX

### terraform import をとりあえず打ってみた

先程も書きましたが、まずはファイルを作成し、枠だけ書いておく必要があります。
エラーメッセージで言われている通りにファイルを作っていきましょう。

```
[terraform/envs/aws/workspace]
$ terraform import aws_cloudfront_distribution.example XXXXXXXXXXXXX
Error: resource address "aws_cloudfront_distribution.example" does not exist in the configuration.

Before importing this resource, please create its configuration in the root module. For example:

resource "aws_cloudfront_distribution" "example" {
  # (resource arguments)
}
```

### ファイルを作成し、枠となる部分だけ書く

```
[terraform/envs/aws/workspace]
$ vim cloudfront_distribution.tf
```

```
[terraform/envs/aws/workspace]
$ cat cloudfront_distribution.tf
resource "aws_cloudfront_distribution" "example" {
  # (resource arguments)
}
```

### 改めてterraform import

```
[terraform/envs/aws/workspace]
$ terraform import aws_cloudfront_distribution.example XXXXXXXXXXXXX
aws_cloudfront_distribution.example: Importing from ID "XXXXXXXXXXXXX"...
aws_cloudfront_distribution.example: Import prepared!
  Prepared aws_cloudfront_distribution for import
aws_cloudfront_distribution.example: Refreshing state... [id=XXXXXXXXXXXXX]

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 plan で差分を確認

planを打ってみると、
requiredのblocksがいろいろない
enabledは必要
と言われました。

```
[terraform/envs/aws/workspace]
$ terraform plan

Error: Insufficient viewer_certificate blocks

  on  line 0:
  (source code not available)

At least 1 "viewer_certificate" blocks are required.


Error: Insufficient default_cache_behavior blocks

  on  line 0:
  (source code not available)

At least 1 "default_cache_behavior" blocks are required.


Error: Insufficient restrictions blocks

  on  line 0:
  (source code not available)

At least 1 "restrictions" blocks are required.


Error: Insufficient origin blocks

  on  line 0:
  (source code not available)

At least 1 "origin" blocks are required.


Error: Missing required argument

  on cloudfront_distribution.tf line 1, in resource "aws_cloudfront_distribution" "example":
   1: resource "aws_cloudfront_distribution" "example" {

The argument "enabled" is required, but no definition was found.
```

### エラーメッセージに従って必須項目を用意

順番にやっていこうと思ったのでエラーメッセージで言われたもののみの作成にとどめてみました！

```
[terraform/envs/aws/workspace]
$ cat cloudfront_distribution.tf
resource "aws_cloudfront_distribution" "example" {
  # (resource arguments)

  enabled             = true

  origin {

  }


  default_cache_behavior {

  }

  restrictions {

  }

  viewer_certificate {

  }

}

```

### terraform plan2回目

見ていくと、
blocksの中でblocksがまだ必要なパターンと、
The argumentで必要なものがあるパターンが出てきました。

```
[/terraform/envs/aws/workspace]
$ terraform plan

Error: Insufficient geo_restriction blocks

  on  line 0:
  (source code not available)

At least 1 "geo_restriction" blocks are required.


Error: Insufficient forwarded_values blocks

  on  line 0:
  (source code not available)

At least 1 "forwarded_values" blocks are required.


Error: Missing required argument

  on cloudfront_distribution.tf line 6, in resource "aws_cloudfront_distribution" "example":
   6:   origin {

The argument "domain_name" is required, but no definition was found.


Error: Missing required argument

  on cloudfront_distribution.tf line 6, in resource "aws_cloudfront_distribution" "example":
   6:   origin {

The argument "origin_id" is required, but no definition was found.


Error: Missing required argument

  on cloudfront_distribution.tf line 17, in resource "aws_cloudfront_distribution" "example":
  17:   default_cache_behavior {

The argument "cached_methods" is required, but no definition was found.


Error: Missing required argument

  on cloudfront_distribution.tf line 17, in resource "aws_cloudfront_distribution" "example":
  17:   default_cache_behavior {

The argument "viewer_protocol_policy" is required, but no definition was
found.


Error: Missing required argument

  on cloudfront_distribution.tf line 17, in resource "aws_cloudfront_distribution" "example":
  17:   default_cache_behavior {

The argument "allowed_methods" is required, but no definition was found.


Error: Missing required argument

  on cloudfront_distribution.tf line 17, in resource "aws_cloudfront_distribution" "example":
  17:   default_cache_behavior {

The argument "target_origin_id" is required, but no definition was found.


```


このような感じの繰り返しになります！

**terraform plan → エラーメッセージを読む → エラーで言われた通りにファイルに記述**

この手順を繰り返して、既にあるインフラリソースとコードを同じ状態にしていきます。

## まとめ

①枠だけつくる。
②importする。
③plan error 記述　の繰り返し

import機能は現時点でめちゃめちゃ便利！とは言い難いです。エラーメッセージもたくさんみるし、地道な修正作業を繰り返すことになります。
しかし、逆に言えばエラーメッセージさえ読めれば、怖くないと思うので、まだコード化できていないインフラリソースがある人は是非やってみてください！
やってみると、当初の想像より、かなり単純な作業に感じました！

最後までお読みいただきありがとうございました！

## 参考リンク

Terraformはupdateを活発にしてくれるので、公式の情報をしっかり追うようにしましょう！

https://www.terraform.io/docs/import/index.html

https://www.terraform.io/docs/import/usage.html

https://www.terraform.io/docs/commands/import.html

https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73#terraform-%E3%81%A8%E3%81%AF