10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-06-27

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

今までは

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

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

main.tf
resource "azurerm_resource_group" "motomiya_qiita" {
  # (resource arguments)
}

そしたらTerminalで以下を実行しましょう。
terraform import [terraformで利用するResource type].[リソース名] [リソースID]

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

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

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に書き直します。
それが地味に大変。 コピーして貼り付けだけで済むと思ったら大間違いです。
リソースグループは以下のような形がテンプレートなので…

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

  tags = {
    environment = "Production"
  }
}

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

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

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

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

新しい機能では

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

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

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

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

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

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

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

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機能への対応も行っています。

参考

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?