既存の 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 の取得が簡単です。

![terraform-import-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/1f486552-1767-884c-9178-43dc930ae276.png)

下記のアイコンをクリックして、クリップボードにリソース ID をコピーします。

![terraform-import-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/ad47ea6b-eef6-246b-39a1-38e7bb72c69b.png)


## Terraform インポートの例

クリップボードにコピーしたリソース ID をペーストして、下記の例だと Web PubSub のリソースをインポートします。

```text:bash
$ 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 でインポートします。

```text:bash
$ 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.
```