既存の Azure リソースを Terraform にインポートする時に発生するよくあるエラー
初めて触る Azure リソースは、Azure ポータルからリソースを作成してクイックスタートやチュートリアルを行い、どのような機能があり、どのような動作をするのかを確かめたりします。一通り確かめた後、Azure リソースを作りっぱなしだと課金が継続したり、いつ作ったのかわからない Azure リソースがゴミとして残るのを避けるため、一旦 Azure リソースを削除します。次回、同じ Azure リソースを作成して再検証したい場合に備えて、Azure リソースを削除する前に Terraform にインポートしておきたくなります。そこで今回は、既存の Azure リソースを Terraform にインポートする時に発生するよくあるエラーと、エラーの対処方法をやってみました。
基本的な Azure リソースのインポート形式
例えば、リソースグループの azurerm_resource_group
にインポートする場合は、下記のような形式になります。< リソース ID >には、リソースグループのリソース ID を指定します。
terraform import azurerm_resource_group.rg < リソース ID >
リソース ID の取得例
下記の「 JSON ビュー」を使用すると、リソース ID の取得が簡単です。
下記のアイコンをクリックして、クリップボードにリソース ID をコピーします。
Terraform インポートの例
クリップボードにコピーしたリソース ID をペーストして、下記の例だと Web PubSub のリソースをインポートします。
$ terraform import azurerm_web_pubsub.sio /subscriptions/25695fc8-dcaa-430e-874c-f98a857adbe2/resourceGroups/mnrsio-rg/providers/Microsoft.SignalRService/WebPubSub/mnrsio
azurerm_web_pubsub.sio: Importing from ID "/subscriptions/25695fc8-dcaa-430e-874c-f98a857adbe2/resourceGroups/mnrsio-rg/providers/Microsoft.SignalRService/WebPubSub/mnrsio"...
╷
│ Error: parsing "/subscriptions/25695fc8-dcaa-430e-874c-f98a857adbe2/resourceGroups/mnrsio-rg/providers/Microsoft.SignalRService/WebPubSub/mnrsio": parsing segment "staticWebPubSub": parsing the WebPubSub ID: the segment at position 6 didn't match
│
│ Expected a WebPubSub ID that matched:
│
│ > /subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/example-resource-group/providers/Microsoft.SignalRService/webPubSub/webPubSubValue
│
│ However this value was provided:
│
│ > /subscriptions/25695fc8-dcaa-430e-874c-f98a857adbe2/resourceGroups/mnrsio-rg/providers/Microsoft.SignalRService/WebPubSub/mnrsio
│
│ The parsed Resource ID was missing a value for the segment at position 6
│ (which should be the literal value "webPubSub").
よくあるエラーと対処方法
クリップボードにコピーしてペーストしたリソース ID 文字列の大文字小文字が Terraform 側が想定しているものと違うため、このようなエラーとなっています。
具体的には、ペーストしたリソース ID に含まれる WebPubSub
が、Terraform 側は webPubSub
で受け取らないといけないようです。
エラーメッセージの一番最後の (which should be the literal value "webPubSub").
がポイントです。
対処方法として、WebPubSub
を webPubSub
に変更したリソース ID でインポートします。
$ terraform import azurerm_web_pubsub.sio /subscriptions/25695fc8-dcaa-430e-874c-f98a857adbe2/resourceGroups/mnrsio-rg/providers/Microsoft.SignalRService/webPubSub/mnrsio
azurerm_web_pubsub.sio: Importing from ID "/subscriptions/25695fc8-dcaa-430e-874c-f98a857adbe2/resourceGroups/mnrsio-rg/providers/Microsoft.SignalRService/webPubSub/mnrsio"...
azurerm_web_pubsub.sio: Import prepared!
Prepared azurerm_web_pubsub for import
azurerm_web_pubsub.sio: Refreshing state... [id=/subscriptions/25695fc8-dcaa-430e-874c-f98a857adbe2/resourceGroups/mnrsio-rg/providers/Microsoft.SignalRService/webPubSub/mnrsio]
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.
Discussion