Azure は Microsoft が提供する様々なクラウドサービスのプラットフォームです。Amazon の AmazonWebService、Google の GoogleCloudPlatform みたいなものです。Azureは2010年から続くサービスであり、インターネット上に多くの情報が転がっています。このため昔から変わらず提供されている基幹的な部分はChatGPTに訊いても十分な答えが返ってきやすいです。
Terraformはクラウド上のもろもろを定義ファイルの様にコード化して管理でき、実際にクラウドに適用できるアプリケーションです。2014年から開発が続けられており、こちらもChatGPTでいい感じの答えが返ってきやすいです。
ChatGPTを用いて Azure と Terraform で Azure 上に仮想マシンを用意する例を紹介します。前提条件として Azure への登録は済んでいるものとしています。仮想マシンを用意するのは無料枠でも十分できます。
まずはどこから始めるかを質問しながら進めます。この時、自分がどの段階にいるかも伝えると適切な部分から始めてくれやすいです。ここでは Azure と Terraform を使えばいい感じになることは知っているので「Azure と Terraform を用意するところから初めて欲しい」と伝えました。
ChatGPTに伝えた文言
Azure上にTerraformで仮想マシンを用意したいです。どの様にすればいいでしょうか?Azure CLIのやTerraformのインストールから始めてください。実行環境はWindows11です。
Azure上にTerraformで仮想マシンを構築するための一般的な手順は以下の通りです。注意:以下の説明は教育的な目的のみであり、プロダクション環境での利用前に適切なテストと検証が必要です。
-
Microsoftの公式サイトからインストーラをダウンロードしてください:Azure CLI Install
-
ダウンロードしたインストーラを開き、指示に従ってインストールを完了させます。
-
インストールが成功したら、コマンドプロンプトを開き、以下のコマンドでバージョン情報を確認してください。
az --version
-
HashiCorpの公式サイトからTerraformのWindows版をダウンロードしてください:Terraform Download
-
ZIPファイルを解凍して、
terraform.exe
を適当なディレクトリ(例:C:\terraform
)に置きます。 -
環境変数
PATH
にTerraformのバイナリが置かれたディレクトリ(例:C:\terraform
)を追加します。 -
コマンドプロンプトを開き、以下のコマンドでバージョン情報を確認してください。
terraform --version
コマンドプロンプトを開き、以下のコマンドでAzureにログインします。
az login
- 適当なディレクトリを作成し、その中に
main.tf
という名前のファイルを作ります。 main.tf
に以下のような内容を記述します(適宜調整が必要です)。
provider "azurerm" {
features {}
}
resource "azurerm_virtual_network" "example" {
name = "example-vnet"
resource_group_name = azurerm_resource_group.example.name
location = azurerm_resource_group.example.location
address_space = ["10.0.0.0/16"]
}
resource "azurerm_subnet" "example" {
name = "example-subnet"
resource_group_name = azurerm_resource_group.example.name
virtual_network_name = azurerm_virtual_network.example.name
address_prefix = "10.0.1.0/24"
}
resource "azurerm_virtual_machine" "example" {
name = "example-vm"
resource_group_name = azurerm_resource_group.example.name
location = azurerm_resource_group.example.location
vm_size = "Standard_DS1_v2"
network_interface_ids = [azurerm_network_interface.example.id]
// その他の設定(OSイメージ、ストレージ、など)
}
resource "azurerm_resource_group" "example" {
name = "example-resources"
location = "East US"
}
resource "azurerm_network_interface" "example" {
name = "example-nic"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.example.id
private_ip_address_allocation = "Dynamic"
}
}
- コマンドプロンプトで
main.tf
が置かれたディレクトリに移動します。 terraform init
で初期化します。terraform apply
で仮想マシンを作成します。
これでAzure上にTerraformで設定した仮想マシンが作成されるはずです。何か問題があれば、エラーメッセージを確認して適切な対応を行ってください。
それなりにまとまった内容が返ってきました。初見だと分かりにくいどことどこに同じ値を設定するかなどの部分も読み取れます。とはいえこれそのままではまだ不十分です。これを解決するために都度返答を見ながら何度か注文を付けます。
注文内容
- exampleの代わりにcpoint-labを使ってください
- 日本語のコメントをつけてください
- 仮想マシンの種類はubuntu22.04にしてください
- セキュリティ上ベタ書きすべきでないものは外部ファイルから読み込むようにしてください
- 日本に配置してください
この結果が次です。
1 2 | # secrets.tfvars admin_password = "YourSecurePasswordHere" |
# main.tf | |
# Azure プロバイダを設定 | |
provider "azurerm" { | |
features {} | |
} | |
# セキュリティ対策としてベタ書きを避けるための変数定義 | |
variable "admin_password" { | |
description = "仮想マシンの管理者パスワード" | |
} | |
# リソースグループを作成 | |
resource "azurerm_resource_group" "cpoint-lab" { | |
name = "cpoint-lab-resources" | |
location = "Japan East" | |
} | |
# 仮想ネットワークを作成 | |
resource "azurerm_virtual_network" "cpoint-lab" { | |
name = "cpoint-lab-vnet" | |
resource_group_name = azurerm_resource_group.cpoint-lab.name | |
location = azurerm_resource_group.cpoint-lab.location | |
address_space = ["10.0.0.0/16"] | |
} | |
# サブネットを作成 | |
resource "azurerm_subnet" "cpoint-lab" { | |
name = "cpoint-lab-subnet" | |
resource_group_name = azurerm_resource_group.cpoint-lab.name | |
virtual_network_name = azurerm_virtual_network.cpoint-lab.name | |
address_prefix = "10.0.1.0/24" | |
} | |
# ネットワークインターフェースを作成 | |
resource "azurerm_network_interface" "cpoint-lab" { | |
name = "cpoint-lab-nic" | |
location = azurerm_resource_group.cpoint-lab.location | |
resource_group_name = azurerm_resource_group.cpoint-lab.name | |
ip_configuration { | |
name = "internal" | |
subnet_id = azurerm_subnet.cpoint-lab.id | |
private_ip_address_allocation = "Dynamic" | |
} | |
} | |
# Ubuntu 22.04 仮想マシンを作成 | |
resource "azurerm_linux_virtual_machine" "cpoint-lab" { | |
name = "cpoint-lab-vm" | |
resource_group_name = azurerm_resource_group.cpoint-lab.name | |
location = azurerm_resource_group.cpoint-lab.location | |
size = "Standard_DS1_v2" | |
network_interface_ids = [ | |
azurerm_network_interface.cpoint-lab.id, | |
] | |
admin_username = "adminuser" | |
admin_password = var.admin_password | |
disable_password_authentication = false | |
source_image_reference { | |
publisher = "Canonical" | |
offer = "0001-com-ubuntu-server-jammy" | |
sku = "22_04-lts-gen2" | |
version = "22.04.202308140" | |
} | |
os_disk { | |
caching = "ReadWrite" | |
storage_account_type = "Standard_LRS" | |
} | |
} |
これを次のコマンドで実行します。
1 2 | terraform init terraform apply -var-file="secrets.tfvars" |
実行するとエラーになるので次の様にChatGPTに投げて返答をもらいます。これぐらいエラーメッセージが親切な場合はそのまま自分でも直せますが、ここでは例としてChatGPTに伝えます。一番効果を発揮するのはなんだかよくわからないけど何か詳しそうなことを言っているエラーの解決です。
ChatGPTに伝えた文言
次のエラーが出ました。原因と修正方法を提案してみてください。
> terraform apply -var-file="secrets.tfvars" ╷ │ Error: Missing required argument │ │ on main.tf line 27, in resource "azurerm_subnet" "cpoint-lab": │ 27: resource "azurerm_subnet" "cpoint-lab" { │ │ The argument "address_prefixes" is required, but no definition was found. ╵ ╷ │ Error: Unsupported argument │ │ on main.tf line 31, in resource "azurerm_subnet" "cpoint-lab": │ 31: address_prefix = "10.0.1.0/24" │ │ An argument named "address_prefix" is not expected here. Did you mean "address_prefixes"? ╵
このエラーは、azurerm_subnet
リソースの address_prefix
パラメータが期待されていない(もしくは廃止された)ことを示しています。代わりに address_prefixes
パラメータを使用する必要があります。このパラメータはリスト形式でIPアドレスの範囲を受け取ります。
main.tf
ファイルの azurerm_subnet
リソース定義部分を以下のように修正してください。
# サブネットを作成
resource "azurerm_subnet" "cpoint-lab" {
name = "cpoint-lab-subnet"
resource_group_name = azurerm_resource_group.cpoint-lab.name
virtual_network_name = azurerm_virtual_network.cpoint-lab.name
address_prefixes = ["10.0.1.0/24"] # <--- 修正点: "address_prefix" を "address_prefixes" に変更し、リスト形式にする
}
この修正により、address_prefix
の代わりに address_prefixes
を使い、値もリスト形式(["10.0.1.0/24"]
)に変更しています。
修正後、再度以下のコマンドを実行して設定を適用してください。
terraform init
terraform apply -var-file="secrets.tfvars"
これでエラーが解消され、適用が正常に行われるはずです。
これで改めて実行すると次の様に Azure 上に仮想マシンとそれに付随する一式が揃えられます。
これだけで何ができるというわけでもありませんが、あまりファイルの数や大きさが増えずインターネット上に知見の貯まっている Terraform は ChatGPT に向いた題材です。最新機能を操作するには心もとない面もありますが、Azure や Terraform をよく知らない状態から手を進めるにはとても便利です。