📕
(雑)Azure SDKで作成したリソースをaztfexportしてみた
はじめに
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