[A-00153]TerraformでAzure VMを作成する
Azure上にTerraformでVMを作成します。
・Architecture

・Terraform作成/実行
terraform {
  required_providers {
    azapi = {
      source  = "azure/azapi"
      version = "1.9.0"
    }
    azurerm = {
        source = "hashicorp/azurerm"
        version = "3.71.0"
    }
    random = {
      source  = "hashicorp/random"
      version = "3.5.1"
    }
  }
}
provider "azurerm" {
    features {}
}resource "random_pet" "ssh_key_name" {
    prefix = "ssh"
    separator = ""
}
# AZAPI SSH KEY GENERATE
resource "azapi_resource_action" "ssh_public_key_gen" {
  type        = "Microsoft.Compute/sshPublicKeys@2022-11-01"
  resource_id = azapi_resource.ssh_public_key.id
  action      = "generateKeyPair"
  method      = "POST"
  response_export_values = ["publicKey", "privateKey"]
}
# AZAPI RESOURCE
resource "azapi_resource" "ssh_public_key" {
    type      = "Microsoft.Compute/sshPublicKeys@2022-11-01"
    name      = random_pet.ssh_key_name.id
    location  = var.location_name
    parent_id = azurerm_resource_group.default.id
}
# OUTPUT "KEY DATA"
output "key_data" {
    value = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
}# RESOURCE GROUP
resource "azurerm_resource_group" "default" {
    name = "rg"
    location = var.location_name
}
# VIRTUAL NETWORK
resource "azurerm_virtual_network" "default" {
    name = "vn"
    address_space = ["10.0.0.0/16"]
    location = var.location_name
    resource_group_name = azurerm_resource_group.default.name
}
# SUBNET
resource "azurerm_subnet" "default" {
    name = "subnet"
    resource_group_name = azurerm_resource_group.default.name
    virtual_network_name = azurerm_virtual_network.default.name
    address_prefixes = [ "10.0.1.0/24" ]
}
# PUBLIC IP
resource "azurerm_public_ip" "default" {
    name = "default-ip"
    location = var.location_name
    resource_group_name = azurerm_resource_group.default.name
    allocation_method = "Dynamic"
}
# NSG(NETWORK SECURITY GROUP)
resource "azurerm_network_security_group" "default" {
    name = "nsg"
    location = var.location_name
    resource_group_name = azurerm_resource_group.default.name
    security_rule {
        name = "SSH"
        priority = 1001
        direction = "Inbound"
        access = "Allow"
        protocol = "Tcp"
        source_port_range = "*"
        destination_port_range = "22"
        source_address_prefix = "*"
        destination_address_prefix = "*"
    }
}
# NETWORK INTERFACE
resource "azurerm_network_interface" "default" {
    name = "ni"
    location = var.location_name
    resource_group_name = azurerm_resource_group.default.name
    ip_configuration {
        name = "internal"
        subnet_id = azurerm_subnet.default.id
        private_ip_address_allocation = "Dynamic"
        public_ip_address_id = azurerm_public_ip.default.id
    }
}
# SECURITY GROUP ASSOCIATION
resource "azurerm_network_interface_security_group_association" "default" {
    network_interface_id = azurerm_network_interface.default.id
    network_security_group_id = azurerm_network_security_group.default.id
}
# STORAGE ACCOUNT
resource "azurerm_storage_account" "default" {
    name = "strgac20230906"
    location = var.location_name
    resource_group_name = azurerm_resource_group.default.name
    account_tier = "Standard"
    account_replication_type = "LRS"
}
# VM(VIRTUAL MACHINE)
resource "azurerm_linux_virtual_machine" "default" {
    name = "vm"
    location = var.location_name
    resource_group_name = azurerm_resource_group.default.name
    network_interface_ids = [ azurerm_network_interface.default.id ]
    size = "Standard_DS1_v2"
    os_disk {
        name = "onDisk"
        caching = "ReadWrite"
        storage_account_type = "Premium_LRS"
    }
    source_image_reference {
        publisher = "RedHat"
        offer = "RHEL"
        sku = "8-lvm-gen2"
        version = "latest"
    }
    computer_name = "hostname"
    admin_username = var.user_name
    admin_ssh_key {
        username = var.user_name
        public_key = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
    }
    boot_diagnostics {
        storage_account_uri = azurerm_storage_account.default.primary_blob_endpoint
    }
}variable "location_name" {
    default = "japaneast"
}
variable "user_name" {
    default = "az_user"
}output "resource_group_name" {
    value = azurerm_resource_group.default.name
}
output "public_ip_address" {
    value = azurerm_linux_virtual_machine.default.public_ip_addresses
}上記を作成したら下記のコマンドを実行してください
terraform init -upgrade
terraform plan
terraform apply下記の通りVMが作成されます。

上記が確認できたら下記のコマンドで後片付けしてください。
terraform destroy・Appendix
公式ドキュメント
※日本語版はSSHKEYの作成箇所がまるっと抜けてます。参照する際は英語版を見てください。
https://learn.microsoft.com/ja-jp/azure/virtual-machines/linux/quick-create-terraform
https://learn.microsoft.com/en-us/azure/virtual-machines/linux/quick-create-terraform?tabs=azure-cli
参考文献
コメントを残す