Terraform1.5で追加されたimportブロックが素敵過ぎた ので共有したいです!
今までは
まず最初に、今までの方法をおさらいしていきましょう。
motomiya_qiita
という名前のリソースグループをAzure環境から取り込みます。まず適当なファイル(ここでは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ファイルにリソース情報が書き込まれます。
例えば以下の通り。
{
"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に出力された内容を書きなおします。
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
を作ります。
import{
id = "[リソースID]"
to = [リソースタイプ].[Terraformでのリソース名]
}
同じようにリソースグループをimportするには、以下のようにします。
import{
id = "/subscriptions/[サブスクID]/resourceGroups/motomiya_qiita"
to = azurerm_resource_group.main
}
そしてterraform plan
を実行。このときにHCLを書き込みたいファイル名も指定してあげます。
追記はできないので新規作成のみです。
terraform plan -generate-config-out=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機能への対応も行っています。
参考