Terraformのどのリソース種別で定義すべきか困った話(Azure編)

# はじめに

こんにちはあるいはこんばんは。みなさんは、AzureのリソースIDを見てそれがterraformのazurermプロバイダのどのリソース種別(resourceブロックで指定する部分)に該当するのかわからずに困ったことはあるでしょうか？
ない？そうかもしれません。ふつうのterraform利用の流れでは、terraformコードを作成してデプロイし、デプロイ後にリリースIDを見れるようになります。今回のお題は、すでにazure上にリソースがwebコンソール手動操作などでデプロイ済みで、これからこの環境のterraformコードを作成したい流れでの、リソースIDからterraformのリソース種別の"逆引き"です。

例えば以下リソースIDが、以下だったとします。

```posh
/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/example-rg/providers/Microsoft.Web/serverFarms/example-asp
```

このリソースIDから、azurermプロバイダの "azurerm_service_plan" を見つける場合です。リソースIDの文字列から推測するのが難しいですよね。私は非常に困ったので、AzureのリソースIDとazurermプロバイダのリソース種別を紐づけた記録をご紹介します。

# Azure resource IDとは

前述の通り、リソースのプロパティや、ARMテンプレートに記載されています。以下例として、3リソースのリソースIDを記します。

```posh
/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/example-rg/providers/Microsoft.ApiManagement/service/example-apim
/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/example-rg/providers/Microsoft.Storage/storageAccounts/examplestorage
/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/example-rg/providers/Microsoft.Web/serverFarms/example-asp
```

- 11111111-1111-1111-1111-111111111111: サブスクリプションID
- example-rg: リソースグループ名
- 行末のexample-XXX: リソースの名前。任意です。
- リソースグループ名と、リソースの名前の間: リソース種類

と、重要な情報がすべて入っていますね。

# azurermプロバイダとは

Terraformのhashicorpが提供するAzure Providerです。

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs

他に、azapiプロバイダというものがあります。これはご参考で、今回記事はazurermプロバイダを主眼に置いています。

https://learn.microsoft.com/ja-jp/azure/developer/terraform/overview-azapi-provider

# 単純web検索では見つけにくい

以下リソースIDを見てみます。

```posh
/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/example-rg/providers/Microsoft.Web/serverFarms/example-asp
```

「providers/」と「/example-asp（リソースの任意の名前）」の間の「**Microsoft.Web/serverFarms**」がリソースの種類を表しています。

この「Microsoft.Web/serverFarms」をweb検索すると、Microsoftのwebサイトにたどりつきます。ここにはazapiプロバイダとの関連がありますが、azurermプロバイダとの関連は記載がありませんのでご注意ください。

https://learn.microsoft.com/ja-jp/azure/templates/microsoft.web/serverfarms?pivots=deployment-language-terraform

また、azurermプロバイダページの検索窓に「Microsoft.Web/serverFarms」と入力しても検索できません。

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs

困りました...

# 解決方法1: web検索でドメインを絞り込む

registry.terraform.io　ドメインに絞って検索するようにします。「Microsoft.Web/serverFarms」を探す場合、以下のようにします。この方法、手軽に検索できるのですが、正しいazurermプロバイダのページが上位に出てくる保証がありません。

- Googleの場合: Microsoft.Web/serverFarms site:registry.terraform.io/
- Bingの場合: Microsoft.Web/serverFarms domain:registry.terraform.io/

# 解決方法2: 関連付けリストを作成する

紐づけのリストが無いなら作るしかない、ということで作成します。作り方としては、azurermプロバイダページのソースをダウンロードしてきて、webページをgrepして作ります。リスト自体の公開は難しいので、作り方をご紹介します。

1.azurermプロバイダページのダウンロード

以下URLのコードをダウンロードします。

https://github.com/hashicorp/terraform-provider-azurerm

2.ディレクトリをgrep
   
- grep対象ディレクトリ: terraform-provider-azurerm-main/website/docs/r
- grep文字列: "terraform import "

3.整形

grepで抽出した結果を見てみましょう。
「Microsoft.Web/serverFarms」の行を見てみましょう。スペース区切りで要素分割します。

```posh
terraform import azurerm_service_plan.example /subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Web/serverfarms/farm1

```

「import」の次の要素から「.example」をぬいた要素「azurerm_service_plan」: これが目的のazurermプロバイダにおけるリソース種別です。

# まとめ

今回は、日常業務で非常に困っていた部分をなんとか解決してみました。もう少しスマートな方法があったらよかったのですが、検索した限りでは見つからなかったため、なんとか関連付けしてみました。以上、AzureのリソースIDとazurermプロバイダを紐づけた記録でした。

---
- Microsoft Azure は，Microsoft Corporation の商標または登録商標です。
- Terraform は、HashiCorp, Inc. の米国およびその他の国における商標または登録商標です。
- その他、本資料に記述してある会社名、製品名は、各社の登録商品または商標です。