【Azure】【Terraform】【ChatGPT】ChatGPTの力を借りてTerraformを使ってAzure上にシンプルな仮想マシンを立てる

  • 2023年9月22日
  • 2023年9月22日
  • Azure

 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で仮想マシンを構築するための一般的な手順は以下の通りです。注意:以下の説明は教育的な目的のみであり、プロダクション環境での利用前に適切なテストと検証が必要です。

1. Azure CLIのインストール

  1. Microsoftの公式サイトからインストーラをダウンロードしてください:Azure CLI Install

  2. ダウンロードしたインストーラを開き、指示に従ってインストールを完了させます。

  3. インストールが成功したら、コマンドプロンプトを開き、以下のコマンドでバージョン情報を確認してください。

    az --version
    

2. Terraformのインストール

  1. HashiCorpの公式サイトからTerraformのWindows版をダウンロードしてください:Terraform Download

  2. ZIPファイルを解凍して、terraform.exeを適当なディレクトリ(例:C:\terraform)に置きます。

  3. 環境変数PATHにTerraformのバイナリが置かれたディレクトリ(例:C:\terraform)を追加します。

  4. コマンドプロンプトを開き、以下のコマンドでバージョン情報を確認してください。

    terraform --version
    

3. Azureへのログイン

コマンドプロンプトを開き、以下のコマンドでAzureにログインします。

az login

4. Terraformファイルの作成

  1. 適当なディレクトリを作成し、その中にmain.tfという名前のファイルを作ります。
  2. 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"
  }
}

5. Terraformの初期化と実行

  1. コマンドプロンプトでmain.tfが置かれたディレクトリに移動します。
  2. terraform initで初期化します。
  3. 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"
}
}
view raw main.tf hosted with ❤ by GitHub

 これを次のコマンドで実行します。

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 をよく知らない状態から手を進めるにはとても便利です。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG