はじめに
「Azure環境でTerraformを使ってみる(1/2)」の続きです。
初めてterraformを使う方かつAzureで試してみたい方向けにやり方をまとめました。
概要
前回はネットワークを作成したので今回はVMを作成しネットワークに配置したいと思います。
構成図
最終的な構成図です。
二つのサブネットを含むVNETと3枚のNWインターフェースを持つVMを1台作成します
作業の流れ
- (前回の記事)ネットワークを作成するコードを準備
- (前回の記事)terraformの環境を準備
- (前回の記事)terraformを実行
- VMを作成するコードを準備
- terraformを実行
手順
4.VMを作成するコードを準備
- Networkのコードを準備した時と同じようにVMを作成するコードを準備します
丸ごとコピーしてローカルPCのメモ帳などで作成し保存して下さい
VM、パブリックIP、ネットワークインターフェースを作成するコードを作成します
vm.tfのos_profile の部分は必ず適当に書き換えて下さい。
ユーザー名はadminなどでもよいのですが、パスワードは複雑なものにしておかないとterraformでリソースを作成中にエラーが発生して失敗します
(やり直して手間取るのが嫌な方は難しくしておいてください)
admin_username = "username"
admin_password = "password"
vm.tf
###############################
# vm00を作成
###############################
# パブリックIPアドレスを作成
resource "azurerm_public_ip" "vm00_publicip" {
name = "vm00_PublicIP"
location = "Japan East"
resource_group_name = "${azurerm_resource_group.ec_group.name}"
allocation_method = "Dynamic"
}
# ネットワークインターフェース1を作成
resource "azurerm_network_interface" "vm00_BKnic" {
name = "vm00_NIC01"
location = "Japan East"
resource_group_name = "${azurerm_resource_group.ec_group.name}"
ip_configuration {
name = "vm00_NIC01Configuration"
subnet_id = "${azurerm_subnet.ec_BKsubnet.id}"
private_ip_address_allocation = "Dynamic"
public_ip_address_id = "${azurerm_public_ip.vm00_publicip.id}"
}
}
# ネットワークインターフェース1にセキュリティーグループを紐付ける
resource "azurerm_network_interface_security_group_association" "assoc00" {
network_interface_id = azurerm_network_interface.vm00_BKnic.id
network_security_group_id = azurerm_network_security_group.eclinux_nsg.id
}
# ネットワークインターフェース2を作成
resource "azurerm_network_interface" "vm00_FR01nic" {
name = "vm00_NIC02"
location = "Japan East"
resource_group_name = "${azurerm_resource_group.ec_group.name}"
ip_configuration {
name = "vm00_NIC02Configuration"
subnet_id = "${azurerm_subnet.ec_FRsubnet.id}"
private_ip_address_allocation = "Dynamic"
}
}
# ネットワークインターフェース2にセキュリティーグループを紐付ける
resource "azurerm_network_interface_security_group_association" "assoc01" {
network_interface_id = azurerm_network_interface.vm00_FR01nic.id
network_security_group_id = azurerm_network_security_group.eclinux_nsg.id
}
# ネットワークインターフェース3を作成
resource "azurerm_network_interface" "vm00_FR02nic" {
name = "vm00_NIC03"
location = "Japan East"
resource_group_name = "${azurerm_resource_group.ec_group.name}"
ip_configuration {
name = "vm00_NIC03Configuration"
subnet_id = "${azurerm_subnet.ec_FRsubnet.id}"
private_ip_address_allocation = "Dynamic"
}
}
# 仮想サーバーの作成
resource "azurerm_virtual_machine" "vm00" {
name = "vm00"
location = "Japan East"
resource_group_name = "${azurerm_resource_group.ec_group.name}"
network_interface_ids = ["${azurerm_network_interface.vm00_BKnic.id}","${azurerm_network_interface.vm00_FR01nic.id}","${azurerm_network_interface.vm00_FR02nic.id}"]
primary_network_interface_id="${azurerm_network_interface.vm00_BKnic.id}"
vm_size = "Standard_B2s"
storage_os_disk {
name = "vm00_OsDisk"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Premium_LRS"
}
storage_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy-daily"
sku = "22_04-daily-lts"
version = "latest"
}
os_profile {
computer_name = "vm00"
admin_username = "*****"
admin_password = "*****"
}
os_profile_linux_config {
disable_password_authentication = false
}
}
5.terraformを実行
- ローカルに作成したvm.tfファイルをコンソールにドラック&ドロップする
lsを実行してファイルがアップロードされたことを確認する
nosecape@Azure:~$ ls
clouddrive network.tf terraform.tfstate terraform.tfstate.backup vm.tf
nosecape@Azure:~$
2. terraform planを実行します
nosecape@Azure:~$ terraform plan
azurerm_resource_group.ec_group: Refreshing state... [id=/subscriptions/xxx/resourceGroups/education_env]
・
・
<省略>
・
・
5. terraform applyを実行します(リソースの作成を行います)
nosecape@Azure:~$ terraform apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# azurerm_network_interface.ecvm00_BKnic will be created
+ resource "azurerm_network_interface" "ecvm00_BKnic" {
+ applied_dns_servers = (known after apply)
+ dns_servers = (known after apply)
+ enable_accelerated_networking = false
+ enable_ip_forwarding = false
+ id = (known after apply)
+ internal_dns_name_label = (known after apply)
+ internal_domain_name_suffix = (known after apply)
・
・
<省略>
・
・
+ storage_os_disk {
+ caching = "ReadWrite"
+ create_option = "FromImage"
+ disk_size_gb = (known after apply)
+ managed_disk_id = (known after apply)
+ managed_disk_type = "Premium_LRS"
+ name = "ecvm00_OsDisk"
+ os_type = (known after apply)
+ write_accelerator_enabled = false
}
}
Plan: 7 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
6. Enter a value と出てくるのでyesと入力します
Enter a value: yes
azurerm_network_interface.ecvm00_FE02nic: Creating...
azurerm_network_interface.ecvm00_FE01nic: Creating...
azurerm_public_ip.ecvm00_publicip: Creating...
azurerm_network_interface.ecvm00_FE02nic: Creation complete after 3s
・
・
<省略>
・
・
azurerm_virtual_machine.ecvm00: Still creating... [6m20s elapsed]
azurerm_virtual_machine.ecvm00: Creation complete [id=/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Compute/virtualMachines/ecvm00]
Apply complete! Resources: 7 added, 0 changed, 0 destroyed.
nosecape@Azure:~$
これでリソースが出来上がりました。
確認していきましょう。
7.リソースグループを見てみます
VMやネットワークインターフェイスなどが作成されています
これで予定のリソース作成が完成しました
最後に
思った以上に準備も含めて構築が簡単にできたと思います
ぜひ効率化のために使いましょう
おまけ
1 VMにNICを複数枚付けた特殊な構成にしたことにあまり意味はありません。
2 環境を消す場合はterraform destroyコマンドを実行します
nosecape@Azure:~$ terraform destroy
azurerm_resource_group.ec_group: Refreshing state... [id=/subscriptions/xxxx/resourceGroups/education_env]
azurerm_virtual_network.ec_network: Refreshing state... [id=/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/virtualNetworks/EducationNetwork]
・
・
<省略>
・
・
Plan: 0 to add, 0 to change, 13 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
・
・
<省略>
・
・
azurerm_network_interface_security_group_association.example000: Destroying... [id=/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/networkInterfaces/edvm00_NIC01|/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/networkSecurityGroups/SSHNetworkSecurityGroup]
azurerm_network_interface_security_group_association.assoc01: Destroying... [id=/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/networkInterfaces/edvm00_NIC02|/subscriptions/xxxx/resourceGroups/education_env/providers/Microsoft.Network/networkSecurityGroups/SSHNetworkSecurityGroup]
Destroy complete! Resources: 13 destroyed.
nosecape@Azure:~$