LoginSignup
2
1

More than 1 year has passed since last update.

Terraformを使用したAzure VM構築

Last updated at Posted at 2022-05-22

はじめに

IaCツールの1つであるTerraformのスクリプトを作成し、MicrosoftのAzure環境にVMインスタンスを構築してみました。ここでは、スクリプトの参考例をご紹介します。

検証環境

Windows10 Home Edition
Terraform V1.1.9 on windows_amd64
provider:registry.terraform.io/hashicorp/azurerm v3.6.0

今回Azure上に構築する環境

下記のリソースを全て東日本リージョンに作成するものとします。

  • リソースグループ
  • VNET(仮想ネットワーク)
    • IPアドレス範囲:10.0.0.0/16
  • サブネット
    • IPアドレス範囲:10.0.1.0/24
  • NSG(ネットワーク・セキュリティー・グループ)
    • 外部からのSSH接続(ポート:22)を許可するようにします。
  • NIC(ネットワーク・インタフェース・カード)
    • VMインスタンスに少なくとも1つは必要です。
  • Public IP
    • VMインスタンスにssh接続する際に必要になります。
  • Linux VMインスタンス
    • Linuxのディストリビューションには、Ubuntu Server 18.04 LTSを使用するものとします。

なお、Azureではサブネットを作成すれば自動的にシステムルートが作成されるため、AWSやIBM Cloudのようなルートテーブルの設定は不要になります。これについては下記サイトに記載があります。
仮想ネットワーク トラフィックのルーティング

Azureへの事前認証

Terraformを使用してAzure環境構築を行う場合には、事前にAzureへの認証が必要になります。以下のリンク先に事前認証設定方法をまとめていますので、ご参照ください。
TerraformでAzure環境構築するための事前のAzure認証設定

今回作成したTerraformスクリプト

下記のTerraform Azure Providerの紹介サイトを参考に作成しました。
Azure Provider

上記リンク先を元に、今回作成したスクリプトは下記のものになります。スクリプト名はmain.tfとしておきます。

main.tf
terraform{
    required_providers{
        azurerm={
            source  = "hashicorp/azurerm"
            version = "=3.6.0"
        }
    }
}

# Configure the Microsoft Azure Provider
provider "azurerm" {
  features {}
}

# Create Resource Group
resource "azurerm_resource_group" "rg"{
    name = "My-RG"
    location = "Japan East"
}

#Create Virtual Network
resource "azurerm_virtual_network" "vnet"{
    name = "Test-VNET"
    resource_group_name = azurerm_resource_group.rg.name
    location = azurerm_resource_group.rg.location
    address_space = ["10.0.0.0/16"]

    tags = {
        Name = "Test"
    }

}

#Create Subnet
resource "azurerm_subnet" "subnet"{
    name = "Test-Public-Subnet"
    resource_group_name = azurerm_resource_group.rg.name
    virtual_network_name = azurerm_virtual_network.vnet.name
    address_prefixes = ["10.0.1.0/24"]
}

#Create Network Security Group
resource "azurerm_network_security_group" "nsg"{
    name = "TestVM-Security-Group"
    resource_group_name = azurerm_resource_group.rg.name
    location = azurerm_resource_group.rg.location

    security_rule{
        name = "sg-ssh22"
        protocol = "Tcp"
        priority = 300
        direction = "Inbound"
        access = "Allow"
        source_port_range = "*"
        destination_port_range = 22
        source_address_prefix = "*"
        destination_address_prefix = "*"
    }
     
    tags={
        Name = "Test-SG"
    } 

}

#Association between Subnet and Network Security Group
resource "azurerm_subnet_network_security_group_association" "nsga"{
    network_security_group_id = azurerm_network_security_group.nsg.id
    subnet_id = azurerm_subnet.subnet.id
}

#Create public ip
resource "azurerm_public_ip" "public_ip"{
    name = "Test-Public-IP"
    resource_group_name = azurerm_resource_group.rg.name
    location = azurerm_resource_group.rg.location
    allocation_method = "Dynamic"
}

#Create Network Interface Card
resource "azurerm_network_interface" "nic"{
    name = "Test-NIC"
    resource_group_name = azurerm_resource_group.rg.name
    location = azurerm_resource_group.rg.location

    ip_configuration{
        name = "internal"
        private_ip_address_allocation = "Dynamic"
        subnet_id = azurerm_subnet.subnet.id
        public_ip_address_id = azurerm_public_ip.public_ip.id
    }

    tags = {
        Name = "Test-NIC"
    }

}

#Association between Network Interface Card and Network Security Group
resource "azurerm_network_interface_security_group_association" "nisga"{
    network_interface_id = azurerm_network_interface.nic.id
    network_security_group_id = azurerm_network_security_group.nsg.id
}

#Create Linux VM Instance
resource "azurerm_linux_virtual_machine" "lvm"{
    name = "Test-VM"
    resource_group_name = azurerm_resource_group.rg.name
    location = azurerm_resource_group.rg.location
    size = "Standard_A1_v2"
    admin_username = "adminuser"
    
    network_interface_ids = [
        azurerm_network_interface.nic.id,
    ]

    admin_ssh_key{
        username = "adminuser"
        public_key = file("~/.ssh/Az-Test-VM_key.pub")
    }

    os_disk{
        caching = "ReadWrite"
        storage_account_type = "Standard_LRS"
    }

    source_image_reference{
        publisher = "Canonical"
        offer = "UbuntuServer"
        sku = "18.04-LTS"
        version = "latest"
    }

    tags = {
        Name = "Test"
    }

}

Terraformスクリプトによる環境作成

  • main.tfファイルのあるフォルダ上で、下記のコマンドを順番に実施するだけでOKです。
    • terraform plan
      • シンタックスエラーなどがあれば、そこでわかります。
    • terraform apply
      • Do you want to perform these actions?と聞いてくるので、yesを応答する。
  • 問題なく環境作成できているか否かは、実際にAzureポータルログオンして確認するか、Azure CLIを使用して確認します。

作成したAzure VMインスタンスへの接続確認

今回VMインスタンスに付与されたPublic IPは、20.89.139.115です。こちらに対して、秘密鍵(~/.ssh/Az-Test-VM_key)、ログオン用ユーザーID(adminuser)でssh接続を実施します。

$ ssh -i ~/.ssh/Az-Test-VM_key adminuser@20.89.139.115
The authenticity of host '20.89.139.115 (20.89.139.115)' can't be established.
ECDSA key fingerprint is SHA256:0oLoQhIdZSCYCV90FWnldDXISEpLln8m+sTDMD1vfrw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '20.89.139.115' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 5.4.0-1078-azure x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun May 22 09:11:04 UTC 2022

  System load:  0.08              Processes:           117
  Usage of /:   4.8% of 28.90GB   Users logged in:     0
  Memory usage: 10%               IP address for eth0: 10.0.1.4
  Swap usage:   0%

0 updates can be applied immediately.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

adminuser@Test-VM:~$ 

無事、Azure VMインスタンスに接続できました!

Terraformスクリプトによる環境破棄

  • main.tfファイルのあるフォルダ上で、下記のコマンドを実施するだけでOKです。
    • terraform destroy
      • Do you want to destroy all resources?と聞いてくるので、yesを応答する。
  • 問題なく環境破棄されたか否かは、実際にAzureポータルログオンして確認するか、Azure CLIを使用して確認します。

さいごに

今回は以下を実施し、問題ないことを確認しました。

  • Terraformスクリプトを使用して、Microsoft Azure環境にVMインスタンスを構築・破棄できること。
  • 構築したVMインスタンスにssh接続ができること。

ただ、スクリプトをいきなり書くよりは、Azureポータルから実際にVMインスタンス構築を実施し、Azure慣れしてからの方が良いと思いました。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1