Azure上の構築済みリソースをTerraformで自動的にコード化してみた

今回はAzure上に構築済みのリソースを自動でコードに落とし込み、Terraform上で管理できるようにし、コードによってパラメータ変更ができるようにする方法について紹介したいと思います。

事前準備

Terraformの準備

前回私が投稿した以下サイトに習い、Terraformの準備をしてください。

TerraformでAzureにリソースを構築
IaCの中でもマルチクラウドに対応しているTerraformについて紹介したいと思います。

リソースの準備

事前にAzure上でリソースの作成をしてください。今回は以下のような設定のVirtual Machineを例にします。

コード作成

まず、既存リソースからコードを自動的に作成します。作成するにはimportブロックを用います。importブロックは任意の名前で作成した「.tfファイル」内に記述してください。

import {
    id = "/subscriptions/サブスクリプションID/resourceGroups/リソースグループ名/providers/Microsoft.Compute/virtualMachines/仮想マシン名"
    to = azurerm_virtual_machine.import-vm
}

idではVMのリソースIDを入力してください。リソースIDは対象VMの「プロパテイ」から参照することができます。
toの「import-vm」の部分はTerraform内での名前なので、自由に設定してください。

コマンド実行

以下コマンドにより、既存リソースの設定からコードを自動生成します。

terraform plan -generate-config-out = "ファイル名.tf"

このコマンドを実行することで、コマンド内で指定したファイル名の「.tfファイル」が自動的に生成され、そのファイル内で以下のようなコードが自動的に生成されます。

resource "azurerm_virtual_machine" "import-vm" {
        location              = "japaneast" 
        name                  = "" 
        network_interface_ids = [""] 
        resource_group_name   = "Terraform_Verification" 
        tags                 = {Name = ""} 
        vm_size               = "Standard_B1ls" 
        zones                 = ["1"]
        additional_capabilities {      
        }
        boot_diagnostics {
            enabled     = true 
            # (1 unchanged attribute hidden)
        }
        os_profile_linux_config {
        disable_password_authentication = false 
        }

        storage_image_reference {
            id        = null
            offer     = "ubuntu-24_04-lts" 
            publisher = "canonical" 
            sku       = "server" 
            version   = "latest" 
        }

        storage_os_disk {
            caching                   = "ReadWrite" 
            create_option             = "FromImage" 
            disk_size_gb              = 30 
            managed_disk_id           = "" 
            managed_disk_type         = "StandardSSD_LRS" 
            name                      = "" 
            os_type                   = "Linux" 
            write_accelerator_enabled = false 
            # (2 unchanged attributes hidden)
        }
        delete_data_disks_on_termination = true
        }

コードが生成出来たら以下コマンドを実行します。

terraform apply

上記コマンドを実行すると、「Plan:1 to import」と表示されるので、「yes」を記述し、Enterを押下します。
これによりリソースをTerraformで管理できるようになり、生成されたコードを修正し「terraform apply」を実行することでパラメータの変更ができるようになります。

注意事項

コードを自動生成する際に、ユーザ名やパスワードなどの機密情報等、パラメータによっては表示されないものがあります。生成されないパラメータの中には「terraform apply」実行時にエラーを発生させるものもありますので注意してください。どうしてもエラーを解消できない場合は、生成されたコードのresourceブロック内でエラーの出ているパラメータを以下のようにlifecycleブロックの「ignore_changes」で囲み、再度「terraform apply」を実行してみてください。

  lifecycle {
      ignore_changes = [
      os_profile,
      boot_diagnostics,
      additional_capabilities
  ]
  }

このブロックは本来、値を変更したくないパラメータがあるときに使用するものですが、エラー解消に役立つので使ってみてください。

感想

たった数行のコードで既存のリソースを自動でコードに落とし込めるのは驚きましたし、コードを書くのが苦手な人でも一旦ポータル上で構築してから運用する際はコードで管理するということができるので非常に便利だと思いました。

おわりに

今回はTerraformによる既存Azureリソースのコード化について紹介しました。新規作成のみならず既存リソースの取り込みもできれば、運用も楽になると思いますのでぜひ使ってみてください。

タイトルとURLをコピーしました