😽

Terraform で Azure VM Extention (AMA) を導入する

2023/01/21に公開
1

Azure で IaC といえば、ARM Template か Bicep が挙げられるが、Terraform も使用できる。もし、利用環境が Azure のみである場合は Bicep の方ができることが多いため非常にお勧めしたいところだが、他のクラウド環境やオンプレミスが混在する環境であれば Terraform の方が良い場合もある。なぜならば、他の環境も Terraform で作成できるし、書き方を統一することができるからだ。

今回のテーマ: Azure VM に Azure Monitorin エージェントを入れる

Azure VM (仮想マシン) を作成するとき、ネットワークやストレージなどを作成するが、同時に監視周りも導入することが大半だ。Terraform で同じことを実施しようとすると、VM 拡張機能を使用して、Azure Monitor エージェントを導入することとなる。

VM 拡張機能は、Azure VM でのデプロイ後の構成と自動タスクを提供する複数の小さなアプリケーションであり、Azure Monitor エージェント以外にも Chef や Datadog の拡張機能を導入することができる。VM 拡張機能についての説明

今回は、以下の内容を Terraform で作成する。

  • リソースグループ
  • VNet
  • サブネット
  • ネットワーク インターフェース
  • ディスク
  • VM 拡張機能 (Azure Monitoring エージェント)

また、Azure Monitoring エージェントは Log Analytics エージェントの後継の立ち位置となっており、Log Analytics エージェント自体は 2024 年に排することがすでに発表されている。

Terraform のベース

Terraform を以下の 3 つのファイルで作成する。

  • providers.tf
  • variables.tf
  • main.tf

今回は、Terraform 自体の説明ではないので簡易的に記載した。

providers.tf

Terraform がどのバージョン以上を要求するか、または何のプロバイダー(例えば Azure や AWS などのクラウドプロバイダー) を使用するかを宣言する。

今回は以下のように設定した。

terraform {
  required_version = ">=1.3.5"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.34.0"
    }
  }
}

provider "azurerm" {
  features {}
}

この場合は、Terraform のバージョンが、1.3.5 以上であることが求められている。また、Azurerm (Azure のプロバイダー)を利用することと、そのバージョンについても記載をしている。

variables.tf

変数を格納しておくファイル。なくても良いが、同じ文字列を使い回したり、後から一括で修正&管理する場合は、利用したい。main.tf に記載しても良いが、管理が大変なので少ない場合でも利用しておいた方が、のちの自分から感謝されるはずである。

今回は以下のように設定した。

variable "vm_name" {
  default     = "tf-VM"
  description = "Location of the resource group."
}

variable "az_resource_group_name" {
  default = "tf-dev"
}

variable "az_location" {
  default     = "eastus2"
  description = "Location of the resource group."
}

variable "project" {
  default = "tf"
}

main.tf

Terraform でやりたいことを全て記載する場所。
ゼロから書き始めるのは非常に骨が折れるので、公式サイトから拝借することが多いと思う。

多数のシチュエーションを含めたサンプルは Azure ドキュメントのこちらに記載がされている。非常に充実しているので、これをベースにして必要なものを足し差しすれば良いと思う。

VM 拡張機能の追加

ここが今回の本題の拡張機能を追加する部分。仮想マシンについては、この追加の後に記載している。
拡張機能を入れる場合は azurerm_virtual_machine_extension を使用する。これを記述することによって仮想マシンに拡張機能を追加することができる。

今回は Azure Monitoring エージェントを導入したいため、publlisher は Microsoft.Azure.Monitor を使用する。
この publisher の内容は、こちらを参考にして追記する。
また、同じく重要な type も同じ URL を参考にして追記する。今回は Linux 用の Azure Monitoring エージェントを導入するが、そうでない場合は適宜読み替えて変更する。
そうすると、以下のような設定で追加ができる。

resource "azurerm_virtual_machine_extension" "example" {
      name                       = "AzureMonitorLinuxAgent"
      publisher                  = "Microsoft.Azure.Monitor"
      type                       = "AzureMonitorLinuxAgent"
      type_handler_version       = "1.24"
      auto_upgrade_minor_version = "false"
    
      virtual_machine_id = azurerm_virtual_machine.example.id
}

aut_upgrade_minor_version はアップグレードを自動設定するかが設定できる。これは Azure Portal からでも変更できる。
type_handler_version も使用したいバージョンを設定できる。ただし、1.x.z のように細かいバージョン指定はできなかった。1.x までを指定し、その x の最新バージョンが自動的に指定される動作だった。(つまり、1.9.10 が最新であれば、1.9 と記載することで 1.9.10 が入る。1.9.9 や 1.9.0 は導入されない)

あとは、対象の仮想マシンを指定して完了。

仮想マシンの作成

仮想マシン (シンプル) に必要なのは、以下の内容である。

  • リソースグループ
  • VNet
  • サブネット
  • ネットワーク インターフェース
  • ディスク
  • 仮想マシン本体

リソースグループ

リソースグループを作成する。

resource "azurerm_resource_group" "example" {
  name     = var.az_resource_group_name
  location = var.az_location
}

VNet とサブネット

VNet とサブネットを作成する。

// VNet
resource "azurerm_virtual_network" "example" {
  name                = "acctvn"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

// サブネット
resource "azurerm_subnet" "example" {
  name                 = "acctsub"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.2.0/24"]
}

ネットワーク インターフェース

ネットワーク インターフェースを作成する。

resource "azurerm_network_interface" "example" {
  name                = "acctni"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  ip_configuration {
    name                          = "testconfiguration1"
    subnet_id                     = azurerm_subnet.example.id
    private_ip_address_allocation = "Dynamic"
  }
}

ディスク

ディスク周り。

resource "azurerm_storage_account" "example" {
  name                     = "storagename"
  resource_group_name      = azurerm_resource_group.example.name
  location                 = azurerm_resource_group.example.location
  account_tier             = "Standard"
  account_replication_type = "LRS"

  tags = {
    environment = "staging"
  }
}

resource "azurerm_storage_container" "example" {
  name                  = "vhds"
  storage_account_name  = azurerm_storage_account.example.name
  container_access_type = "private"

仮想マシン

仮想マシンを作成する。今まで作成してきたネットワークなどの情報を一気に紐付ける。

resource "azurerm_virtual_machine" "example" {
  name                  = var.vm_name
  location              = azurerm_resource_group.example.location
  resource_group_name   = azurerm_resource_group.example.name
  network_interface_ids = [azurerm_network_interface.example.id]
  vm_size               = "Standard_F2"

  storage_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }

  storage_os_disk {
    name          = "myosdisk1"
    vhd_uri       = "${azurerm_storage_account.example.primary_blob_endpoint}${azurerm_storage_container.example.name}/myosdisk1.vhd"
    caching       = "ReadWrite"
    create_option = "FromImage"
  }

  os_profile {
    computer_name  = var.vm_name
    admin_username = "azureadmin"
    admin_password = "XXXXXX"
  }

  os_profile_linux_config {
    disable_password_authentication = false
  }

  tags = {
    environment = "staging"
  }
}

実行する

これらを全て合わせて(仮想マシンを最初に記述)、実行すると仮想マシンおよび拡張機能が作成される。

$ terraform init
$ terraform plan

で、特にエラーも出ないことを確認して

% 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.example will be created
  + resource "azurerm_network_interface" "example" {
      + applied_dns_servers           = (known after apply)
      + dns_servers                   = (known after apply)
      + enable_accelerated_networking = false
()
Apply complete! Resources: 8 added, 0 changed, 0 destroyed.

Azure Portal を見に行くとリソースが作成されているのがわかる。

おわりに

Terraform で仮想マシンを作成し、そこに対して Azure Monitoring エージェントが導入できた。通常は”作れること”以外の確認であれば、仮想マシン以外にも付随して作成が必要なリソースはあるはずなので、こういったエージェントもその中の1つだと思う。

GitHubで編集を提案
Microsoft (有志)

Discussion