やりたいこと
Azure で Terraform を使っていて、AzAPI なるものがあることを知ったので、調べた内容を備忘録も兼ねてここにまとめます。
AzAPI とは
公式ドキュメントより
AzAPI プロバイダーは、 Azure ARM REST API の上にある薄いレイヤーです。 AzAPI プロバイダーを使用すると、任意の API バージョンを使用して任意の Azure リソースの種類を管理できます。 このプロバイダーは、新しい Azure リソースとプロパティ (プライベート プレビューを含む) の管理を有効にすることで、AzureRM プロバイダーを補完します。
そもそも、Terraform は HCL (HashiCorp Configuration Language) という専用の記述言語で、作成すべきリソースを定義していく。
HCL は、Azure や GCP、AWS などが提供するプロバイダーを利用していて、その実体は、各クラウドの API を呼んでいるだけ (と思っている) なので、プレビュー段階のサービスはまだその API を Terraform から使えないことが多い。
AzAPI はそういったプレビュー段階のサービスも Terraform から作成できるようにするもの、というのが個人的な理解。Azure のリソースプロバイダー (AzureRM) よりさらに API に近い部分のラッパー的な位置づけ。
公式ドキュメント内では、以下の利点があると述べている。
AzAPI プロバイダーには、次のような利点があります。
- すべての Azure サービスをサポートします。
- プライベート プレビュー サービスと機能
- パブリック プレビュー サービスと機能
- すべての API のバージョン
- 完全な Terraform 状態ファイルの忠実性
- プロパティと値は状態に保存
- Swagger への依存関係なし
- 一般的で一貫性のある Azure 認証
プレビュー段階の間は AzAPI プロバイダーを、正式リリースされれば AzureRM プロバイダーを使うことを推奨している。
AzAPI の使い方
基本的には一般的な Terraform の使い方と変わらないが、事前準備として、AzAPI を登録してあげる必要がある。
具体的には、terraform
ブロック内のプロバイダー定義に azapi
を以下のように追加する。その後、terraform init
すれば、terraform plan
や terraform apply
できるようになる。
terraform {
required_providers {
azapi = {
source = "azure/azapi"
version = "=0.1.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "=3.0.2"
}
}
}
ただし、実際のリソース定義は一般的な Terraform での書き方と少し異なる。
例として、以下。
# Provision a Lab Service Account and a Lab that are in public preview
resource "azapi_resource" "qs101-account" {
type = "Microsoft.LabServices/labaccounts@2018-10-15"
name = "qs101LabAccount"
parent_id = azurerm_resource_group.qs101.id
body = jsonencode({
properties = {
enabledRegionSelection = false
}
})
}
AzAPI で作成するリソースについては、すべて azapi_resource
にする。リソース名 ("qs101-account"
の部分) は通常どおり。
type
や name
などは任意で指定するが、注意点として type
には API のバージョンを指定する必要がある (@2018-10-15
の部分)。プレビュー状態のものは、日付の後に -preview
と付く。
各 AzAPI の仕様については、ここ。
ということで
リソースプロバイダーが未提供のリソースも Terraform で作成して管理できるようになった。AzAPI を知る前は、そういったリソースだけ手動でポチポチ作成していたので、だいぶ楽になった。
ただ、AzureRM で提供されるリソースとは種類が異なり、リソースから取得できるプロパティが限られているので、使いたい情報 (接続文字列など) を Terraform のコード内で完結できないことはある。
今回、そもそも Azure の Communication Services E-mail (プレビュー) を使いたかったが、プレビュー段階なので AzureRM が対応しておらず手動で作成していた。それを AzAPI で作成できるようにはなったが、作成されたドメインを Terraform のコード内で、Function Apps のアプリケーション設定に渡すことができなかった。というような手の届かなさはある。でもそれはプレビューなんだから当然!
以上です。