APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Terraformでリソースタイプと名前空間の紐づけで悩んだ話

はじめに

こんにちは、ACS事業部 CIチームの平井です。 今回は、Terraformを使ってAzure環境においてサブネット委任を設定する際のAzureRMプロバイダーのリソースタイプとAzureリソースプロバイダーの名前空間のマッピングについていくつかピックアップしてお話しします。

最後に自分が今回用いた調べ方についても紹介いたしますので、ぜひご覧いただけるとありがたいです。

背景

最近の研修でTerraformを触れる機会がありましたが、その際にAzureのリソースプロバイダーの名前空間とサービス名が一致しないケースが多く、これが原因で設定に時間がかかることがありました。そこで、備忘録も兼ねてこの記事を書かせていただきました。

サブネット委任とは

Azureの仮想ネットワーク(VNet)におけるサブネット委任とは、特定のAzureサービスがサブネット内のリソースを管理および展開できるようにする機能のことを指します。この機能を使用することで、Azureサービスがサブネット内でネットワークリソースを自動的に作成、管理、削除することが容易になります。

learn.microsoft.com

サブネット委任のリソースタイプと名前空間のマッピング

個人的に利用機会の多いと考えるサブネット委任先のリソースタイプと名前空間をいくつかピックアップして紹介します。

1. コンピューティングとアプリケーションホスティング

Azure App Service Plan

タイプ: azurerm_service_plan
名前空間: Microsoft.Web/serverFarms

Azure App Service Environment

タイプ: azurerm_service_environment
名前空間: Microsoft.Web/hostingEnvironments

Azure Kubernetes Service (AKS)

タイプ: azurerm_kubernetes_cluster
名前空間: Microsoft.ContainerService/managedClusters

Azure Container Instances

タイプ: azurerm_container_group
名前空間: Microsoft.ContainerInstance/containerGroups

Azure Container Apps environments

タイプ: azurerm_container_app_environment
名前空間: Microsoft.App/environments

2. データベースサービス

Azure Database for PostgreSQL - Flexible Server

タイプ: azurerm_postgresql_flexible_server
名前空間: Microsoft.DBforPostgreSQL/flexibleServers

Azure Database for MySQL - Flexible Server

タイプ: azurerm_mysql_flexible_server
名前空間: Microsoft.DBforMySQL/flexibleServers

Azure SQL Server

タイプ: azurerm_mssql_server
名前空間: Microsoft.Sql/servers

Azure SQL Managed Instance

タイプ: azurerm_mssql_managed_instance
名前空間: Microsoft.Sql/managedInstances

3. ネットワーキングとセキュリティ

Application Gateway for Containers

タイプ: azurerm_application_load_balancer
名前空間: Microsoft.ServiceNetworking/trafficControllers

Azure Network Watcher

タイプ: azurerm_network_watcher
名前空間: Microsoft.Network/networkWatchers

Azure VPN Gateway

タイプ: azurerm_virtual_network_gateway
名前空間: Microsoft.Network/virtualNetworkGateways

Azure DNS Private Resolver

タイプ: azurerm_private_dns_resolver
名前空間: Microsoft.Network/dnsResolvers

4. API管理とインテグレーション

Azure API Management

タイプ: azurerm_api_management
名前空間: Microsoft.ApiManagement/service

Azure NetApp Files

タイプ: azurerm_netapp_volume
名前空間: Microsoft.Netapp/volumes

調べ方

1. Azureのドキュメント

Microsoft Learnで、各サービスのリソースプロバイダーを確認。

learn.microsoft.com

2. Terraform AzureRMのドキュメント

Terraform Resistryより、各リソースタイプの詳細を確認。

registry.terraform.io

おまけ

ドキュメントのソースソードを検索することで、見つけることもできます。

  1. 以下のAzureRM公式リポジトリよりコードをクローンします。

    github.com

  2. 検索用のpythonコードの作成

     import glob
    
     # ディレクトリ内のマークダウンファイルを検索
     markdown_files = glob.glob('~/terraform-provider-azurerm/website/docs/r/*.markdown')
    
     # 検索ワード
     keyword = 'xxx'
    
     # 各マークダウンファイルを読み込み、keywordを含む行を出力
     for file in markdown_files:
         with open(file, 'r', encoding='utf-8') as f:
             lines = f.readlines()
             start_printing = False
             for line in lines:
                 if '## Import' in line:
                     start_printing = True
                 if start_printing and keyword.lower() in line.lower():
                     print(f'{file}: {line}')
    
  3. ファイルの実行

    keywordazurerm_service_planとしたときの出力

     terraform-provider-azurerm/website/docs/r/service_plan.html.markdown: terraform import azurerm_service_plan.example /subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Web/serverfarms/farm1
    

    providers以降のMicrosoft.xxxxの要素がAzureリソースプロバイダーの名前空間になります。

この方法であればkeywordにリソースIDから取得した名前空間からの逆引きも可能なので、色々と応用が効きそうです。

おわりに

この記事が皆さんの学びや実践に少しでも役立てば嬉しいです。今後も引き続き、TerraformとAzureのについて情報を共有していきたいと思います。

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: <平井亨>