3
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?

More than 1 year has passed since last update.

Terraform の azapi を使ってみた

Posted at

やりたいこと

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 planterraform 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" の部分) は通常どおり。
typename などは任意で指定するが、注意点として type には API のバージョンを指定する必要がある (@2018-10-15 の部分)。プレビュー状態のものは、日付の後に -preview と付く。
各 AzAPI の仕様については、ここ

ということで

リソースプロバイダーが未提供のリソースも Terraform で作成して管理できるようになった。AzAPI を知る前は、そういったリソースだけ手動でポチポチ作成していたので、だいぶ楽になった。
ただ、AzureRM で提供されるリソースとは種類が異なり、リソースから取得できるプロパティが限られているので、使いたい情報 (接続文字列など) を Terraform のコード内で完結できないことはある。
今回、そもそも Azure の Communication Services E-mail (プレビュー) を使いたかったが、プレビュー段階なので AzureRM が対応しておらず手動で作成していた。それを AzAPI で作成できるようにはなったが、作成されたドメインを Terraform のコード内で、Function Apps のアプリケーション設定に渡すことができなかった。というような手の届かなさはある。でもそれはプレビューなんだから当然!

以上です。

3
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
3
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?