[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
参考文献
コメントを残す