Terraform を使用して Windows Azure VM を構築する方法: 手順

それまでにAzureポータルを介してAzure VMを作成したことがありますか?もしそうなら、それを行うのに何回のクリックが必要でしたか?それを何度も何度も行って、特定の標準を満たすために正確な入力値を提供することができますか?おそらくできません。プロセスを自動化する必要があります。TerraformでAzure VMを作成しましょう!

HashicorpのTerraformは、オンプレミスまたはクラウド上のシンプルから複雑なインフラストラクチャを作成するユーティリティです。Terraformは構成ファイルを読み取り、状態を作成して、インフラストラクチャがその状態で作成され、維持されることを確認する単一のバイナリファイルです。

この記事では、Azure VMを作成することでTerraformの使い方を学びます。このチュートリアルは素晴らしいTerraform Azureの例になります。

前提条件

このチュートリアルに従って進める場合、以下の準備が整っていることを確認してください:

このチュートリアルでは、macOSでPowerShell Coreを実行していますが、同じ手順はWindows 10でPowerShell Core、Windows PowerShell、またはWindowsコマンドプロンプトを使用して実行することもできます。

Terraformのインストール

まずはじめに、Terraformをダウンロードする必要があります。これには、あなたの好みによりますが、多くの方法があります。このチュートリアルではmacOSを使用しているため、brew install terraformを実行してHomeBrewを使用できます。また、直接Terraformダウンロードページにアクセスするか、Windowsをお使いの場合はChocolateyを使用することも可能です。

Azure Cloud ShellにはTerraformがプリインストールされていることをご存知でしたか?

Terraformをダウンロードしたら、パスのあるフォルダにコピーし、terraformを実行します。以下のように使用方法の説明が表示されます。これが表示されたら、次に進む準備が整っています。

Terraform Usage Instructions

Azureへの認証

Terraformはプロバイダを使用して各種のオンプレミスとクラウドベンダーと通信します。この場合、Terraform Azureプロバイダを設定する必要があります。Azure CLIをインストールし、既にAzureに認証済みであることを前提に、まずサービスプリンシパルを作成する必要があります。Terraformはこのサービスプリンシパルを使用して認証し、Azureサブスクリプションへのアクセスを取得します。

サービスプリンシパルの作成

コンソールで、Azure CLIを使用してサービスプリンシパルを作成します。その方法は次のとおりです。

まず、以下のaz account listコマンドを使用してサブスクリプションIDを見つけます。

> az account list --query [*].[name,id]

サブスクリプションIDを取得したら、サブスクリプションにスコープされたContributorロールを使用してサービスプリンシパルを作成します。

$subscriptionId = 'xxxx-xxxxx-xxxxx'
$sp = az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/$subscriptionId" -n TerraformTesting | ConvertFrom-Json

Azure CLIはAzureにアクセスして以下のようにパスワードを持つAzure ADアプリケーションを作成します。上記の$sp変数に出力を割り当てるため、appIdpasswordは変数に保存され、後で使用できます。

Azure ID Application with a Password

環境変数を設定します。

Terraformは、Azureに正常に接続するために4つの異なる構成項目を知る必要があります。

  • AzureのサブスクリプションID
  • サービスプリンシパルのAzure ADアプリケーションID
  • サービスプリンシパルのパスワード
  • Azure ADテナント

Terraformにこの情報を提供する方法の1つは、環境変数を使用することです。このチュートリアルではPowerShellコンソール内で作業しているため、$env:を使用してこれらの環境変数を設定できます。TerraformがAzureに接続しようとするときにTerraformが探す各環境変数が表示されます。

az ad sp create-for-rbacの出力が前もって$sp変数に保存されているため、プロパティをコピーして貼り付ける代わりに、単純にプロパティを参照できます。

$env:ARM_SUBSCRIPTION_ID = $subscriptionId
$env:ARM_CLIENT_ID = $sp.appId
$env:ARM_CLIENT_SECRET = $sp.password
$env:ARM_TENANT_ID = $sp.tenant

環境変数を定義したら、TerraformはAzureに接続する準備ができです!

構成ファイルを作成します。

すべてのTerraformの設定は通常、1つのフォルダにモジュール名で作成されます。このチュートリアルでは、モジュールを作成するわけではありませんが、同じ方法を続けます。

PowerShellコンソールで、TerraformTestingという名前のフォルダを任意の場所に作成し、そのディレクトリに移動します。

mkdir TerraformTesting
cd TerraformTesting

次に、main.tfという構成ファイルを作成します。これは、TerraformでAzure VMを構築するための構成が格納される場所です。これは最も一般的に「メイン」構成ファイルと呼ばれる構成ファイルです。このファイルには、構成が管理するすべてのインフラストラクチャのプロバイダとリソースの宣言が含まれます。

構文(HCL)について詳しく学びたい場合は、Michael Levanと私のNo BS Azure and DevOps eBookにTerraformに関する素晴らしい章があります。

main.tfという新しいファイルを、以下のようにTerraformtestingディレクトリ内に作成してください。

## <https://www.terraform.io/docs/providers/azurerm/index.html>
provider "azurerm" {
  version = "=2.5.0"
  features {}
}

## <https://www.terraform.io/docs/providers/azurerm/r/resource_group.html>
resource "azurerm_resource_group" "rg" {
  name     = "TerraformTesting"
  location = "eastus"
}

## <https://www.terraform.io/docs/providers/azurerm/r/availability_set.html>
resource "azurerm_availability_set" "DemoAset" {
  name                = "example-aset"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html>
resource "azurerm_virtual_network" "vnet" {
  name                = "vNet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/subnet.html> 
resource "azurerm_subnet" "subnet" {
  name                 = "internal"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefix       = "10.0.2.0/24"
}

## <https://www.terraform.io/docs/providers/azurerm/r/network_interface.html>
resource "azurerm_network_interface" "example" {
  name                = "example-nic"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

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

## <https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html>
resource "azurerm_windows_virtual_machine" "example" {
  name                = "example-machine"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_F2"
  admin_username      = "adminuser"
  admin_password      = "P@$$w0rd1234!"
  availability_set_id = azurerm_availability_set.DemoAset.id
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

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

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2016-Datacenter"
    version   = "latest"
  }
}

Terraformを初期化する

Terraformは、リソースを作成しようとする際に使用するプロバイダの種類を事前に知る必要があります。これは、作業しているフォルダと同じ場所にこれらのプロバイダをダウンロードするためです。

メインの設定ファイルで定義されているazurermリソースプロバイダを実行することで、terraform initを実行してダウンロードします。これを行うと、以下に似た出力が表示されます。

Downloading the azurerm

設定の検証

作成した構成は完璧ではないかもしれません。信じられないでしょうが、Terraformは構成内の構文エラーを検証する必要があります。そのためには、terraform planコマンドを実行します。このコマンドはディレクトリ内の構成ファイルを読み込み、エラーを報告します。

インフラストラクチャを実際にプロビジョニングする前に、terraform planが表示するエラーを修正してください!

Azure VMの構築

最後に、Azure VMを実際に構築するためにterraform applyを実行します。terraform applyを実行すると、Terraformはディレクトリ内の構成ファイルを読み込み、確認を求めます。”yes”と入力すると、TerraformはAzureに接続し、VMおよび関連するリソースの構築を開始します。

Buildign Azure VM

画面下部に明るく輝く緑色のApply complete!テキストが表示されたら、Terraformはリソースを正常に構築しました!

クリーンアップ

これはデモンストレーション用であり、おそらくこのVMを保持するつもりはないため、自分自身のために行ったすべてを削除してください。

TerraformがAzureに認証するためにサービスプリンシパルを作成しました。以下のaz ad sp deleteコマンドでそれを削除できます。

$spId = ((az ad sp list --all | ConvertFrom-Json) | Where-Object { '<http://TerraformTesting>' -in $_.serviceprincipalnames }).objectId
az ad sp delete --id $spId

次に、terraform destroyを使用して、作成したAzure VMおよび構成ファイル内の他のすべてのリソースを削除します。構成を検証し、実際にterraform destroyを実行した場合の動作をテストする場合は、terraform plan -destroyも実行できます。

結論

Terraformは、さまざまな分野でインフラストラクチャを構築するための素晴らしい無料ツールです。HCLの構文を学ぶことがTerraformの中で最も難しい部分ですが、正直なところ、HCLは直感的な言語です。もしもTerraformやARMテンプレートなどのツールを使用しようと考えているのであれば、Terraformを学んでみてください!

Terraformは現在、多くの人々がサポートしており、多くのコミュニティサポートもあります。

Source:
https://adamtheautomator.com/terraform-azure-vm/