1. はじめに
己の心にギャルを飼え。こんにちは、はしもと(仮名)です。
今月はじめ、Azure ポータルから リソースの Terraform 定義を直接エクスポートできる機能が、パブリックプレビューとして公開されました!
Azure リソースのIaCを実現するための手段としては Bicep や ARMテンプレートなども挙げられますが、Terraformには以下のような利点があります。
- 様々なクラウドプロバイダーに対応
- 多くのSaaSサービスとの連携が可能
- 異なるプラットフォーム間でも同じ記法で一貫したインフラ管理が可能
これらの利点から、Terraformを利用している方は多いのではないでしょうか。私です。
早速試してみたいと思いますが、その前に「Azure Export for Terraform」について少し言及します。
2. Azure Export for Terraform について
以前より「既存の Azure リソースに対応する Terraform 定義をエクスポートする」ためのツールとして、「Azure Export for Terraform (aztfexport)」 が公開、案内されています。
このツールの仕様は以下のとおりです。
- コマンドラインからの実行を前提としている
- 指定したスコープに該当するリソースの設定からterraform 定義を生成
- スコープの指定方法:
- 任意の1リソース
- リソースグループ
- Azure Resource Graphを使用したクエリによるフィルタリング
今回のアップデートにより、未対応のリソースなどはある(後述)ものの、ほぼ同様の操作をポータルから手軽に行えるようになりました。
新しくツールを導入する必要もなく、普段触っている画面から操作できるのは嬉しいですね。
3. Azure Portal からのエクスポート機能
最初のアナウンス記事記載の手順を見ながら、実際に試してみます。
3.1 (事前準備)検証用リソースの作成
検証用に、サブスクリプションに以下のリソースを作成しました。
- リソースグループ:
qiita_test
- ストレージアカウント:
sthaveagalinyourheart
- キューサービス:
test-qiita-queue
ストレージアカウントはリソースグループに関連付けられており、キューはストレージアカウント内に作成しています。
3.2 必須プロバイダの登録
ポータルから利用する際、サブスクリプションの 設定 > リソースプロバイダー
から、Microsoft.AzureTerraform
のプロバイダーを登録する必要があります。
上記を参考に、以下のいずれかの方法で登録を行います。
- Terraformの
azurerm_resource_provider_registration
リソース - azure CLI (
az provider register -n Microsoft.AzureTerraform
) - ポータルからの操作
3.3 生成される Terraform テンプレートの確認
これでエクスポートの準備が整いました。
普段から Azure を使って開発をしているなら、プロバイダの登録を行うだけです。
テンプレートは、対象リソースページのメニュー一覧から オートメーション > テンプレートのエクスポート
を選択することで見ることができます。
出力形式は、AzureRM と AzAPI から選択できます。
-
AzureRM: https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs
-
AzAPI: https://registry.terraform.io/providers/Azure/azapi/latest/docs
エクスポート対象(範囲)は、「リソースグループ」と「ストレージアカウント」の2パターンです。
3.3.1 リソースグループ
AzureRM
画面上に警告が表示されています。詳細を確認します。
まだエクスポートできないリソースタイプが4個あります。これらはテンプレートに含まれません。エラーの詳細を確認してください。
どうやらストレージアカウントの場合、アカウント自体の設定はエクスポートできるものの、ブロブやキューなどの各サービスの設定のエクスポートには非対応のようです。
各サービス内の Terraform リソースは AzureRM プロバイダーに既に実装されていますが、サービスそのもの(storageAccounts/xxxServices
)に対応するリソースは見つけることができず、これが現状エクスポートできない要因のひとつと思われます。
後述する AzAPI プロバイダーを使った出力では問題なく出力できているため、AzureRM プロバイダーでもうまく出力できるようになると嬉しいです。
結果抜粋(実際はリソースごとに詳細な設定内容が記載)
terraform {
required_providers {
azurerm = {
source = "azurerm"
version = "4.5.0"
}
}
}
provider "azurerm" {
features {}
}
# リソースグループ
resource "azurerm_resource_group" "res-0" {
location = "japaneast"
name = "qiita_test"
}
# ストレージアカウント
resource "azurerm_storage_account" "res-1" {
location = "japaneast"
name = "sthaveagalinyourheart"
depends_on = [
azurerm_resource_group.res-0,
]
}
AzAPI
次に AzAPI リソースを使用する場合の生成結果です。
さきほどの警告は表示されず、AzureRM リソースではエクスポートできなかった各サービス (storageAccounts/xxxServices
) やキューの定義も出力に含まれていることが分かります。
結果抜粋(実際はリソースごとに詳細な設定内容が記載)
terraform {
required_providers {
azapi = {
source = "Azure/azapi"
version = "2.0.1"
}
}
}
provider "azapi" {}
# ストレージアカウント
resource "azapi_resource" "res-0" {
location = "japaneast"
name = "sthaveagalinyourheart"
type = "Microsoft.Storage/storageAccounts@2023-05-01"
depends_on = [
azapi_resource.res-6,
]
}
# ブロブサービス
resource "azapi_resource" "res-1" {
name = "default"
type = "Microsoft.Storage/storageAccounts/blobServices@2023-05-01"
depends_on = [
azapi_resource.res-0,
]
}
# ファイルサービス
resource "azapi_resource" "res-2" {
name = "default"
type = "Microsoft.Storage/storageAccounts/fileServices@2023-05-01"
depends_on = [
azapi_resource.res-0,
]
}
# キューサービス
resource "azapi_resource" "res-3" {
name = "default"
type = "Microsoft.Storage/storageAccounts/queueServices@2023-05-01"
depends_on = [
azapi_resource.res-0,
]
}
# キューリソース
resource "azapi_resource" "res-4" {
name = "test-qiita-queue"
type = "Microsoft.Storage/storageAccounts/queueServices/queues@2023-05-01"
depends_on = [
azapi_resource.res-3,
]
}
# テーブルサービス
resource "azapi_resource" "res-5" {
name = "default"
type = "Microsoft.Storage/storageAccounts/tableServices@2023-05-01"
depends_on = [
azapi_resource.res-0,
]
}
# リソースグループ
resource "azapi_resource" "res-6" {
location = "japaneast"
name = "qiita_test"
type = "Microsoft.Resources/resourceGroups@2024-03-01"
}
3.3.2 ストレージアカウント
続いて、リソース単位でのエクスポートも試します。
AzureRM
「あれ、警告出ない?」と思ったのもつかの間、やっぱりストレージアカウントのリソース定義しか含まれていませんでした。惜しい。
リソースグループに対する処理結果と比較すると、リソースグループの定義がなくなり、ストレージアカウントの定義のみが含まれていることが分かります。
結果抜粋(実際はリソースごとに詳細な設定内容が記載)
terraform {
required_providers {
azurerm = {
source = "azurerm"
version = "4.5.0"
}
}
}
provider "azurerm" {
features {}
}
# ストレージアカウント
resource "azurerm_storage_account" "res-0" {
location = "japaneast"
name = "sthaveagalinyourheart"
resource_group_name = "qiita_test"
}
AzAPI
期待する結果としては、リソースグループに対するエクスポート結果から、リソースグループの定義がなくなっていることです。
警告もなく想定どおりになったかと思いきや、今度は AzAPI の結果でも ストレージアカウントのリソース定義 (Microsoft.Storage/storageAccounts
) だけになってしまいました。悔しい。
結果抜粋(実際はリソースごとに詳細な設定内容が記載)
terraform {
required_providers {
azapi = {
source = "Azure/azapi"
version = "2.0.1"
}
}
}
provider "azapi" {}
# ストレージアカウント
resource "azapi_resource" "res-0" {
location = "japaneast"
name = "sthaveagalinyourheart"
type = "Microsoft.Storage/storageAccounts@2023-05-01"
}
Bicep(参考)
参考までに、Bicep での出力結果も記載します。
Bicep だと、Microsoft.Storage/storageAccounts/xxxServices
やキューのリソースも正しく含まれていることが分かります。
結果抜粋(実際はリソースごとに詳細な設定内容が記載)
param storageAccounts_sthaveagalinyourheart_name string = 'sthaveagalinyourheart'
# ストレージアカウント
resource storageAccounts_sthaveagalinyourheart_name_resource 'Microsoft.Storage/storageAccounts@2024-01-01' = {
name: storageAccounts_sthaveagalinyourheart_name
location: 'japaneast'
}
# ブロブサービス
resource storageAccounts_sthaveagalinyourheart_name_default 'Microsoft.Storage/storageAccounts/blobServices@2024-01-01' = {
name: 'default'
}
# ファイルサービス
resource Microsoft_Storage_storageAccounts_fileServices_storageAccounts_sthaveagalinyourheart_name_default 'Microsoft.Storage/storageAccounts/fileServices@2024-01-01' = {
name: 'default'
}
# キューサービス
resource Microsoft_Storage_storageAccounts_queueServices_storageAccounts_sthaveagalinyourheart_name_default 'Microsoft.Storage/storageAccounts/queueServices@2024-01-01' = {
name: 'default'
}
# テーブルサービス
resource Microsoft_Storage_storageAccounts_tableServices_storageAccounts_sthaveagalinyourheart_name_default 'Microsoft.Storage/storageAccounts/tableServices@2024-01-01' = {
name: 'default'
}
# キューリソース
resource storageAccounts_sthaveagalinyourheart_name_default_test_qiita_queue 'Microsoft.Storage/storageAccounts/queueServices/queues@2024-01-01' = {
name: 'test-qiita-queue'
}
3.3.3 【取得不可】Resource Graph のクエリ
Resource Graph クエリを使用したフィルタリング結果からのエクスポートが可能か確認しましたが、クエリ後に Terraform テンプレートを出力するための導線は見つけられませんでした。
見ている画面が間違っているだけかもしれませんが、現状この方法でのエクスポートは aztfexport
を使用するしかないようです。
4. まとめ
パブリックプレビューとなった、Azure Portal からの Terraform エクスポート機能の検証を行いました。
できるようになったこと
- Azure ポータルから直接 Terraform 定義をエクスポートできるようになった
- AzureRM と AzAPI の2種類のプロバイダー形式で出力が選択可能
- 追加ツールなしで既存リソースの IaC 化が容易になった
現状の制限事項
- AzureRM プロバイダーでは、ストレージアカウント内の各サービス(ブロブ、キューなど)の定義がエクスポートできない
- 個別リソースでのエクスポート時には子リソースが含まれない(AzAPI でも同様)
- Resource Graph クエリからのフィルタリングができない
- 複数リソースグループの一括エクスポートができない
これらの機能が必要な場合は、アナウンス内にもあるとおり、従来の aztfexport ツールの使用が推奨されます:
For scripting or exporting many resource groups or resource types, we encourage you to check out the Azure Export for Terraform tool, which comes with customization features.
(訳)スクリプトを作成したり、多数のリソースグループやリソースタイプをエクスポートするには、カスタマイズ機能を備えた Azure Export for Terraform ツールをチェックすることをお勧めします。
プレビュー版としてまだ機能は限定的ですが、日常的に Azure ポータルを使う開発者にとっては便利な機能として、今後の改善に期待したいと思います。
参考