1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Microsoft Azure】ポータルでの Terraform エクスポート機能がパブリックプレビューになった!

Posted at

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

ストレージアカウントはリソースグループに関連付けられており、キューはストレージアカウント内に作成しています。

image.png

3.2 必須プロバイダの登録

ポータルから利用する際、サブスクリプションの 設定 > リソースプロバイダー から、Microsoft.AzureTerraform のプロバイダーを登録する必要があります。

上記を参考に、以下のいずれかの方法で登録を行います。

  • Terraformのazurerm_resource_provider_registrationリソース
  • azure CLI (az provider register -n Microsoft.AzureTerraform)
  • ポータルからの操作

image.png

3.3 生成される Terraform テンプレートの確認

これでエクスポートの準備が整いました。
普段から Azure を使って開発をしているなら、プロバイダの登録を行うだけです。

テンプレートは、対象リソースページのメニュー一覧から オートメーション > テンプレートのエクスポート を選択することで見ることができます。

出力形式は、AzureRM と AzAPI から選択できます。

エクスポート対象(範囲)は、「リソースグループ」と「ストレージアカウント」の2パターンです。

前述したプロバイダー登録が完了していない場合、以下のようなエラーが表示されます
image.png

3.3.1 リソースグループ

AzureRM

image.png

画面上に警告が表示されています。詳細を確認します。

まだエクスポートできないリソースタイプが4個あります。これらはテンプレートに含まれません。エラーの詳細を確認してください。

image.png

どうやらストレージアカウントの場合、アカウント自体の設定はエクスポートできるものの、ブロブやキューなどの各サービスの設定のエクスポートには非対応のようです。

各サービス内の 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) やキューの定義も出力に含まれていることが分かります。

image.png

結果抜粋(実際はリソースごとに詳細な設定内容が記載)
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

image.png

「あれ、警告出ない?」と思ったのもつかの間、やっぱりストレージアカウントのリソース定義しか含まれていませんでした。惜しい。

リソースグループに対する処理結果と比較すると、リソースグループの定義がなくなり、ストレージアカウントの定義のみが含まれていることが分かります。

結果抜粋(実際はリソースごとに詳細な設定内容が記載)
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

期待する結果としては、リソースグループに対するエクスポート結果から、リソースグループの定義がなくなっていることです。

image.png

警告もなく想定どおりになったかと思いきや、今度は 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 での出力結果も記載します。

image.png

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 を使用するしかないようです。

image.png

4. まとめ

パブリックプレビューとなった、Azure Portal からの Terraform エクスポート機能の検証を行いました。

できるようになったこと

  • Azure ポータルから直接 Terraform 定義をエクスポートできるようになった
  • AzureRMAzAPI の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 ポータルを使う開発者にとっては便利な機能として、今後の改善に期待したいと思います。

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?