Azureの既環境からTerraformコードを作成する

# はじめに

こんにちはあるいはこんばんは。みなさん、Terraformを利用していますか？あるいは、webコンソールを操作してクラウドリソースを構築していますか？
どちらもあると思います。ここで、最初はコンソール操作だったプロジェクトで、構築中や構築後にIaCをやろう！となった場合を考えてみてください。なんとなく、Terraformコード作成がコンソールポチポチと同程度の工数がかかってしまいそうです。
今回まさにその状況になったため、ツールを使って解決してみた記録です。

# 前提

- Azureが対象です
- Azureにすでに構築した環境があることとします

# Azure Export for Terraformとは

Azure と Terraform の概念間の翻訳の摩擦を軽減するために設計されたツール。以降aztfexportと称します。

https://learn.microsoft.com/ja-jp/azure/developer/terraform/azure-export-for-terraform/export-terraform-overview

インストール方法は割愛いたします。

なお実行環境は以下です。

- Windows 10 Pro 22H2
- aztfexport.exe v0.14.0(fb772ba)
- terraform.exe v1.6.2

# aztfexport実行前準備

aztfexportを使う前に、以下コマンド実行が必要です。

```posh
PS C:\tmp> az login
PS C:\tmp> az account list -o table
```

1つめのコマンドで、ログイン画面がポップアップするので、適切なMicrosoft IDを選択してください。
2つめのコマンドで、取得したいリソースグループがあるAzureサブスクリプションの「IsDefault」が「True」になっていることを確認してください。

```posh
Name         CloudName    SubscriptionId                        TenantId                              State    IsDefault
-----------  -----------  ------------------------------------  ------------------------------------  -------  -----------
ALPHA        AzureCloud   11111111-1111-1111-1111-111111111111  00000000-0000-0000-0000-000000000000  Enabled  True
BETA         AzureCloud   22222222-2222-2222-2222-222222222222  00000000-0000-0000-0000-000000000000  Enabled  False
```

(表記はダミーです)

もし「IsDefault」が適当でない場合、以下コマンドでセットしてください。

```posh
PS C:\tmp> az account set -s <SubscriptionId>
```

空のディレクトリに移動してください。空でないとエラーになります。

# aztfexportでコード取得してみる

では、以下コマンドでリソースグループ全体を取得してみましょう。

```posh
PS C:\tmp\aztf> aztfexport resource-group <リソースグループ名>
```

残念ながら、試した環境では権限が不足していたのかうまく動作しませんでした。
リソースごとに取得してみましょう。

```posh
PS C:\tmp\aztf> aztfexport resource <リソースID>
```

# Terraformerとは

さまざまなクラウドプロバイダに対応しているツール。

https://github.com/GoogleCloudPlatform/terraformer

インストール方法は割愛いたします。

なお実行環境は以下です。

- Windows 10 Pro 22H2
- terraformer.exe v0.8.24
- terraform.exe v1.6.2

# Terraformer実行前準備

Terraformerを使う前に、以下コマンド実行が必要です。

```posh
PS C:\tmp> az login
PS C:\tmp> $Env:ARM_SUBSCRIPTION_ID=<SubscriptionId>
```

空のディレクトリに移動してください。以下内容の「main.tf」というファイルを作成します。

```tf
terraform {
  backend "local" {}
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>3.65.0"
    }
  }
}

provider "azurerm" {
  features { 
  }
}
```

一度以下コマンドを実行し、Terraformを初期化してください。これで準備完了です。

```posh
PS C:\tmp\tfer> terraform init
```

# Terraformerでコード取得してみる

https://github.com/GoogleCloudPlatform/terraformer/blob/master/docs/azure.md

に記載のオプションごとにコマンドを実行すると、小分類のリソースまで取得してくれます。
このURL記載の「resource group」は、URLに記載の「List of supported Azure resources」の大項目であって、Azureのリソースグループではありませんのでご注意ください。
このリストに記載があれば、基本かならず取得ができます。

たとえばVirtual Networkを取得するには以下のようにします。

```posh
PS C:\tmp\tfer> terraformer import azure -r　virtual_network
```

# aztfexportとTerraformerの比較

今回試したリソースグループで、2つのツールの取得可否状況は以下の通りでした。

| resource | aztfexport | Terraformer | comment |
| --- | --- | --- | --- |
| API management service | Y | N | |
| App Service | Y | Y | Terrafomerは旧形式のazurerm_app_serviceを取得する |
| App Service Plan | Y | N |  |
| Azure Monitor Private Link Scope | Y | N | |
| Log Analytics Workspace | Y | N | |
| Application Gateway | Y | Y | |
| storage account | Y | Y | |
| data collect point | Y | N | |
| network interface | N | Y | |
| network security group | N | Y | |
| public ip address | Y | Y |  |
| private dns zone | Y | Y |  |
| private dns a record | N | Y | |
| private endppoint | N | Y | |
| virtual network | Y | Y | |
| subnet | N | Y | |
| virtual machine | N | Y | |

- aztfexportが取得できないリソースがあった(試した環境の影響かもしれないです)
- Terraformerは、用意されているオプション以外を取得できない

以上より、今回は2つのツールを組み合わせて、全体のリソースを取得しました。

# まとめ

今回目的に対し、ツールをつかってサクッと解決とはならず、ツールの組み合わせで対応しました。
ツールを使うことで、たとえばリソース名をAzureコンソールからTerraformコードにコピペしたり、Azureコンソールのメニューを細かく掘ったり、といったことを省略できたと考えます。

以上、Azureの既環境からTerraformコードを作成した記録でした。

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