📕

(雑)Azure SDKで作成したリソースをaztfexportしてみた

2024/11/21に公開

はじめに

Azure SDKで作成したリソースaztfexportというツールでTerraformのコードに変換してみたらどうなるか試してみました。

aztfexportとは

aztfexportはAzure SDKで作成したリソースをTerraformのコードに変換するツールです。

aztfexportの使い方

実際にやってみた方が早いので割愛

クイックスタート: Azure Export for Terraform を使用して最初のリソースをエクスポートする

SDKでリソースを作成

Program.cs
using System;
using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Compute;
using Azure.ResourceManager.Network;
using Azure.ResourceManager.Resources;

var credential = new DefaultAzureCredential(
    new DefaultAzureCredentialOptions()
    {
        ExcludeVisualStudioCredential = false,
    }
);

// リソースグループの作成
string resourceGroupName = "myResourceGroup";
var armClient = new ArmClient(credential);

SubscriptionResource subscription = armClient.GetDefaultSubscription();
bool exist = await subscription.GetResourceGroups().ExistsAsync(resourceGroupName);

if (!exist)
{
    Console.WriteLine("ResourceGroup does not exist.");
    await subscription.GetResourceGroups().CreateOrUpdateAsync(WaitUntil.Completed, resourceGroupName, new ResourceGroupData(AzureLocation.EastUS));
    Console.WriteLine("ResourceGroup created.");
}else{
    Console.WriteLine("ResourceGroup already exists.");
    ResourceGroupResource resourceGroup = subscription.GetResourceGroup(resourceGroupName);
    await resourceGroup.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("ResourceGroup deleted.");
    await subscription.GetResourceGroups().CreateOrUpdateAsync(WaitUntil.Completed, resourceGroupName, new ResourceGroupData(AzureLocation.EastUS));
    Console.WriteLine("ResourceGroup created.");
}

// ネットワークの作成

string vnetName = "myVnet";

VirtualNetworkData vnetData = new VirtualNetworkData()
{
    Location = AzureLocation.EastUS,
    AddressPrefixes = {"10.0.0.0/16"}
};

ResourceGroupResource Rg = await subscription.GetResourceGroups().GetAsync(resourceGroupName);
await Rg.GetVirtualNetworks().CreateOrUpdateAsync(WaitUntil.Completed, vnetName, vnetData);

string subnetName = $"{vnetName}mySubnet";
SubnetData subnetData = new SubnetData()
{
    Name = subnetName,
    AddressPrefix = "10.0.1.0/24",
};

await Rg.GetVirtualNetworks().Get(vnetName).Value.GetSubnets().CreateOrUpdateAsync(WaitUntil.Completed, subnetName, subnetData);

上記のコードを実行すると、リソースグループとネットワークが作成されます。

aztfexportでコードを生成

aztfexport resource-group myResourceGroup

生成されたコード

main.tf
resource "azurerm_resource_group" "res" {
  location = "eastus"
  name     = "myResourceGroup"
}
resource "azurerm_virtual_network" "res-1" {
  address_space       = ["10.0.0.0/16"]
  location            = "eastus"
  name                = "myVnet"
  resource_group_name = "myResourceGroup"
  depends_on = [
    azurerm_resource_group.res,
  ]
}
resource "azurerm_subnet" "res-2" {
  address_prefixes     = ["10.0.1.0/24"]
  name                 = "myVnetmySubnet"
  resource_group_name  = "myResourceGroup"
  virtual_network_name = "myVnet"
  depends_on = [
    azurerm_virtual_network.res-1,
  ]
}
provider.tf
provider "azurerm" {
  features {
  }
  subscription_id            = "subscription_id"
  environment                = "public"
  use_msi                    = false
  use_cli                    = true
  use_oidc                   = false
  skip_provider_registration = true
}
terraform.tf
terraform {
  backend "local" {}

  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "3.99.0"

    }
  }
}

まとめ

Azure SDKで作成したリソースaztfexportというツールでTerraformのコードに変換してみたらどうなるか試してみました。
ネットワークしか定義されていないリソースグループなので、あまり凄さを感じませんが、複雑なリソースに対してaztfexportを使ったときどうなるかはとても気になるなと思いました。

Discussion