Terrafrom1.5で追加されたimportブロックが素晴らしい

__Terraform1.5で追加されたimportブロックが素敵過ぎた__ ので共有したいです！

# 今までは

まず最初に、今までの方法をおさらいしていきましょう。

`motomiya_qiita`という名前のリソースグループをAzure環境から取り込みます。まず適当なファイル(ここでは`main.tf`とします)に、以下を記載します。

``` terraform:main.tf
resource "azurerm_resource_group" "motomiya_qiita" {
  # (resource arguments)
}
```
そしたらTerminalで以下を実行しましょう。
` terraform import [terraformで利用するResource type].[リソース名] [リソースID]`

```terminal
$ terraform import azurerm_resource_group.motomiya_qiita /subscriptions/[サブスクID]/resourceGroups/motomiya_qiita
```

そうすると、tfstateファイルにリソース情報が書き込まれます。
例えば以下の通り。

```json:tfstate
{
  "version": 4,
  "terraform_version": "1.5.1",
  "serial": 7,
  "lineage": "XXXXXXXXXXXXXXXXXXXXXxx",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "azurerm_resource_group",
      "name": "motomiya_qiita",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "id": "/subscriptions/XXXXXXXXXXXXXXXXxx/resourceGroups/motomiya_qiita",
            "location": "japaneast",
            "name": "motomiya_qiita",
            "tags": {
              "env": "dev",
              "job": "test"
            },
            "timeouts": {
              "create": null,
              "delete": null,
              "read": null,
              "update": null
            }
          },
          "sensitive_attributes": [],
          "private": "xxxxxxxxxxxxxxxxxxxxxx"
        }
      ]
    }
  ],
  "check_results": null
}

```

このJsonで出力されているものを、"頑張って"HCLに書き直します。
__それが地味に大変。__ コピーして貼り付けだけで済むと思ったら大間違いです。
リソースグループは以下のような形がテンプレートなので…

``` terraform
resource "azurerm_resource_group" "example" {
  name     = "testResourceGroup1"
  location = "West US"

  tags = {
    environment = "Production"
  }
}
```

これを参考にtfstateに出力された内容を書きなおします。

``` Terraform:main.tf
resource "azurerm_resource_group" "motomiya_qiita" {
  name     = "motomiya_qiita"
  location = "japaneast" 
  tags = {
    env = "dev"
    job = "test"
  }
}
```

見て分かる通り、必要な情報は`name`と`location`,`tag`だったわけですが、単純にコピーはできません。
resource groupだからまだいいものの、これが100以上のパラメータを持つリソースだったらと思うと…ぞっとしますね。

この変換作業が煩わしいため、多くの人はスクリプトを組んだり、はたまた`terraformer`とかの利用を考えるわけですが、どちらもいばらの道で…大変な思いをしてきたわけです。

# 新しい機能では

これがTerraform1.5で追加された機能によって解決します！
まず`main.tf`を作ります。

``` terraform:main.tf
import{
  id = "[リソースID]"
  to = [リソースタイプ].[Terraformでのリソース名]
}
```

同じようにリソースグループをimportするには、以下のようにします。

``` terraform:main.tf
import{
  id = "/subscriptions/[サブスクID]/resourceGroups/motomiya_qiita"
  to = azurerm_resource_group.main
}
```

そして`terraform plan`を実行。このときにHCLを書き込みたいファイル名も指定してあげます。
追記はできないので新規作成のみです。

``` terminal
terraform plan -generate-config-out=rg.tf
```

すると…__rg.tfファイルが生成されます！！__
中身を見てみましょう。

``` terraform:rg.tf
# __generated__ by Terraform
# Please review these resources and move them into your main configuration files.

# __generated__ by Terraform from "/subscriptions/[サブスクID]/resourceGroups/motomiya_qiita"
resource "azurerm_resource_group" "main" {
  location = "japaneast"
  name     = "motomiya_qiita"
  tags = {
    env = "dev"
    job = "test"
  }
  timeouts {
    create = null
    delete = null
    read   = null
    update = null
  }
}
```

__なんということでしょう。。。あれほど苦労していたtfstateの変換が一瞬で行われてしまいました…！__
素晴らしすぎる…！

初めて行ったときは、素晴らしすぎて感動で胸がいっぱいになりました。
複数のリソースをimportで指定すれば、一回のリソースで複数importもできます。

# ちなみに：AzureとTerraform

Terraform のAzurermプロバイダーは、Microsoft の Azure チームと HashiCorp の Terraform チームによって保守されています。そのため更新に対する追従も素早く行われている印象です。
実はAWSはHashiCorp の Terraform チームだけで保守しているので、アップデートへの追従にはどうしても時間がかかってしまいます。
これもAzureでTerraformを使うメリットになりますね。

今月のアップデート内容は以下の通り。このimport機能への対応も行っています。

https://techcommunity.microsoft.com/t5/azure-tools-blog/terraform-on-azure-june-update/ba-p/3852295

# 参考

https://developer.hashicorp.com/terraform/language/import