チュートリアル:Terraform と HCL を使用した Azure VM クラスターの作成Tutorial: Create an Azure VM cluster with Terraform and HCL

このチュートリアルでは、HCL を使用して小規模なコンピューティング クラスターを作成する方法について説明します。In this tutorial, you see how to create a small compute cluster using HCL.

次のタスクを実行する方法について説明します。You'll learn how to do the following tasks:

  • Azure 認証をセットアップします。Set up Azure authentication.
  • Terraform 構成ファイルを作成します。Create a Terraform configuration file.
  • Terraform 構成ファイルを使用して、ロード バランサーを作成します。Use a Terraform configuration file to create a load balancer.
  • Terraform 構成ファイルを使用して、可用性セットに 2 つの Linux VM をデプロイします。Use a Terraform configuration file to deploy two Linux VMs in an availability set.
  • Terraform を初期化します。Initialize Terraform.
  • Terraform 実行プランを作成します。Create a Terraform execution plan.
  • Terraform 実行プランを適用して、Azure リソースを作成します。Apply the Terraform execution plan to create the Azure resources.

1.Azure 認証をセットアップする1. Set up Azure authentication

注意

Terraform 環境変数を使う場合、または Azure Cloud Shell でこのチュートリアルを実行する場合は、このセクションを省略します。If you use Terraform environment variables, or run this tutorial in the Azure Cloud Shell, skip this section.

このセクションでは、Azure のサービス プリンシパルと、セキュリティ プリンシパルからの資格情報を含む 2 つの Terraform 構成ファイルを生成します。In this section, you generate an Azure service principal, and two Terraform configuration files containing the credentials from the security principal.

  1. Azure AD サービス プリンシパルをセットアップして、Terraform で Azure にリソースをプロビジョニングできるようにします。Set up an Azure AD service principal to enable Terraform to provision resources into Azure. プリンシパルを作成するときに、サブスクリプション ID、テナント、appId、パスワードの値を書き留めておきます。While creating the principal, Make note of the values for the subscription ID, tenant, appId, and password.

  2. コマンド プロンプトを開きます。Open a command prompt.

  3. Terraform ファイルを格納するための空のディレクトリを作成します。Create an empty directory in which to store your Terraform files.

  4. 変数の宣言を保持する新しいファイルを作成します。Create a new file that holds your variables declarations. このファイルには、拡張子が .tf の任意の名前を付けることができます。You can name this file anything you like with a .tf extension.

  5. 変数宣言ファイルに次のコードをコピーします。Copy the following code into your variable declaration file:

    variable subscription_id {}
    variable tenant_id {}
    variable client_id {}
    variable client_secret {}
    
    provider "azurerm" {
       version = "~>1.40"
    
       subscription_id = var.subscription_id
       tenant_id = var.tenant_id
       client_id = var.client_id
       client_secret = var.client_secret
    }
    
  6. Terraform の変数の値を含む新しいファイルを作成します。Create a new file that contains the values for your Terraform variables. Terraform は現在のディレクトリにある terraform.tfvars という名前のファイル (または *.auto.tfvars というパターンのファイル) を自動的に読み込むので、Terraform 変数ファイルの名前は terraform.tfvars にするのが一般的です。It's common to name your Terraform variable file terraform.tfvars as Terraform automatically loads any file named terraform.tfvars (or following a pattern of *.auto.tfvars) if present in the current directory.

  7. 変数ファイルに次のコードをコピーします。Copy the following code into your variables file. 次のように、必ずプレースホルダーを置き換えます。subscription_id には、az account set の実行時に指定した Azure サブスクリプション ID を使用します。Make sure to replace the placeholders as follows: For subscription_id, use the Azure subscription ID you specified when running az account set. tenant_id には、az ad sp create-for-rbac から返された tenant の値を使います。For tenant_id, use the tenant value returned from az ad sp create-for-rbac. client_id には、az ad sp create-for-rbac から返された appId の値を使います。For client_id, use the appId value returned from az ad sp create-for-rbac. client_secret には、az ad sp create-for-rbac から返された password の値を使います。For client_secret, use the password value returned from az ad sp create-for-rbac.

    subscription_id = "<azure-subscription-id>"
    tenant_id = "<tenant-returned-from-creating-a-service-principal>"
    client_id = "<appId-returned-from-creating-a-service-principal>"
    client_secret = "<password-returned-from-creating-a-service-principal>"
    

2.Terraform 構成ファイルを作成する2. Create a Terraform configuration file

このセクションでは、インフラストラクチャのリソース定義を含むファイルを作成します。In this section, you create a file that contains resource definitions for your infrastructure.

  1. main.tf という名前で新しいファイルを作成します。Create a new file named main.tf.

  2. 次のサンプル リソース定義を、新しく作成した main.tf ファイルにコピーします。Copy following sample resource definitions into the newly created main.tf file:

    resource "azurerm_resource_group" "test" {
     name     = "acctestrg"
     location = "West US 2"
    }
    
    resource "azurerm_virtual_network" "test" {
     name                = "acctvn"
     address_space       = ["10.0.0.0/16"]
     location            = azurerm_resource_group.test.location
     resource_group_name = azurerm_resource_group.test.name
    }
    
    resource "azurerm_subnet" "test" {
     name                 = "acctsub"
     resource_group_name  = azurerm_resource_group.test.name
     virtual_network_name = azurerm_virtual_network.test.name
     address_prefix       = "10.0.2.0/24"
    }
    
    resource "azurerm_public_ip" "test" {
     name                         = "publicIPForLB"
     location                     = azurerm_resource_group.test.location
     resource_group_name          = azurerm_resource_group.test.name
     allocation_method            = "Static"
    }
    
    resource "azurerm_lb" "test" {
     name                = "loadBalancer"
     location            = azurerm_resource_group.test.location
     resource_group_name = azurerm_resource_group.test.name
    
     frontend_ip_configuration {
       name                 = "publicIPAddress"
       public_ip_address_id = azurerm_public_ip.test.id
     }
    }
    
    resource "azurerm_lb_backend_address_pool" "test" {
     resource_group_name = azurerm_resource_group.test.name
     loadbalancer_id     = azurerm_lb.test.id
     name                = "BackEndAddressPool"
    }
    
    resource "azurerm_network_interface" "test" {
     count               = 2
     name                = "acctni${count.index}"
     location            = azurerm_resource_group.test.location
     resource_group_name = azurerm_resource_group.test.name
    
     ip_configuration {
       name                          = "testConfiguration"
       subnet_id                     = azurerm_subnet.test.id
       private_ip_address_allocation = "dynamic"
     }
    }
    
    resource "azurerm_managed_disk" "test" {
     count                = 2
     name                 = "datadisk_existing_${count.index}"
     location             = azurerm_resource_group.test.location
     resource_group_name  = azurerm_resource_group.test.name
     storage_account_type = "Standard_LRS"
     create_option        = "Empty"
     disk_size_gb         = "1023"
    }
    
    resource "azurerm_availability_set" "avset" {
     name                         = "avset"
     location                     = azurerm_resource_group.test.location
     resource_group_name          = azurerm_resource_group.test.name
     platform_fault_domain_count  = 2
     platform_update_domain_count = 2
     managed                      = true
    }
    
    resource "azurerm_virtual_machine" "test" {
     count                 = 2
     name                  = "acctvm${count.index}"
     location              = azurerm_resource_group.test.location
     availability_set_id   = azurerm_availability_set.avset.id
     resource_group_name   = azurerm_resource_group.test.name
     network_interface_ids = [element(azurerm_network_interface.test.*.id, count.index)]
     vm_size               = "Standard_DS1_v2"
    
     # Uncomment this line to delete the OS disk automatically when deleting the VM
     # delete_os_disk_on_termination = true
    
     # Uncomment this line to delete the data disks automatically when deleting the VM
     # delete_data_disks_on_termination = true
    
     storage_image_reference {
       publisher = "Canonical"
       offer     = "UbuntuServer"
       sku       = "16.04-LTS"
       version   = "latest"
     }
    
     storage_os_disk {
       name              = "myosdisk${count.index}"
       caching           = "ReadWrite"
       create_option     = "FromImage"
       managed_disk_type = "Standard_LRS"
     }
    
     # Optional data disks
     storage_data_disk {
       name              = "datadisk_new_${count.index}"
       managed_disk_type = "Standard_LRS"
       create_option     = "Empty"
       lun               = 0
       disk_size_gb      = "1023"
     }
    
     storage_data_disk {
       name            = element(azurerm_managed_disk.test.*.name, count.index)
       managed_disk_id = element(azurerm_managed_disk.test.*.id, count.index)
       create_option   = "Attach"
       lun             = 1
       disk_size_gb    = element(azurerm_managed_disk.test.*.disk_size_gb, count.index)
     }
    
     os_profile {
       computer_name  = "hostname"
       admin_username = "testadmin"
       admin_password = "Password1234!"
     }
    
     os_profile_linux_config {
       disable_password_authentication = false
     }
    
     tags = {
       environment = "staging"
     }
    }
    

3.Terraform を初期化する3. Initialize Terraform

前のセクションで作成した Terraform 構成ファイルが格納されているディレクトリを初期化するには、terraform init コマンドを使います。The terraform init command is used to initialize a directory that contains the Terraform configuration files - the files you created with the previous sections. 新しい Terraform 構成を作成した後は常に、terraform init コマンドを実行することをお勧めします。It's a good practice to always run the terraform init command after writing a new Terraform configuration.

ヒント

terraform init コマンドはべき等なので、繰り返し呼び出しても同じ結果が得られます。The terraform init command is idempotent meaning that it can be called repeatedly while producing the same result. したがって、コラボレーション環境で作業していて、構成ファイルが変更されていると思われる場合は、プランを実行または適用する前に、常に terraform init コマンドを呼び出すことをお勧めします。Therefore, if you're working in a collaborative environment, and you think the configuration files might have been changed, it's always a good idea to call the terraform init command before executing or applying a plan.

Terraform を初期化するには、次のコマンドを実行します。To initialize Terraform, run the following command:

terraform init

Terraform の初期化

4.Terraform 実行プランを作成する4. Create a Terraform execution plan

実行プランを作成するには、terraform plan コマンドを使います。The terraform plan command is used to create an execution plan. 実行プランを生成するため、Terraform は現在のディレクトリにあるすべての .tf ファイルを集約します。To generate an execution plan, Terraform aggregates all the .tf files in the current directory.

-out パラメーターにより、実行プランが出力ファイルに保存されます。The -out parameter saves the execution plan to an output file. この機能は、マルチ開発環境でよく見られるコンカレンシーの問題に対処します。This feature addresses concurrency issues common in multi-dev environments. 出力ファイルによって解決されるそうした問題の 1 つに、次のようなシナリオがあります。One such problem solved by the output file is the following scenario:

  1. Dev 1 が構成ファイルを作成します。Dev 1 creates the configuration file.
  2. Dev 2 が構成ファイルを変更します。Dev 2 modifies the configuration file.
  3. Dev 1 が構成ファイルを適用 (実行) します。Dev 1 applies (runs) the configuration file.
  4. Dev 1 は、Dev 2 が構成を変更したことを知らないため、予期しない結果になります。Dev 1 gets unexpected results not knowing that Dev 2 modified the configuration.

Dev 1 が出力ファイルを指定すると、Dev 2 が Dev 1 に影響を及ぼさなくなります。Dev 1 specifying an output file prevents Dev 2 from affecting Dev 1.

実行プランを保存する必要がない場合は、次のコマンドを実行します。If you don't need to save your execution plan, run the following command:

terraform plan

実行プランを保存する必要がある場合は、次のコマンドを実行します。If you need to save your execution plan, run the following command. プレースホルダーをご使用の環境の適切な値に置き換えます。Replace the placeholders with appropriate values for your environment.

terraform plan -out=<path>

もう 1 つの便利なパラメーターは、-var-file です。Another useful parameter is -var-file.

既定では、Terraform は次のように変数ファイルを見つけようとしました。By default Terraform tried to find your variables file as follows:

  • terraform.tfvars という名前のファイルFile named terraform.tfvars
  • *.auto.tfvars のパターンを使用した名前のファイルFile named with using the following pattern: *.auto.tfvars

ただし、変数ファイルは、上記の 2 つの規則のいずれにも従う必要はありません。However, your variables file need not follow either of the two preceding conventions. その場合、変数ファイル名に拡張子が含まれていない -var-file パラメーターを使用して、変数ファイル名を指定します。In that case, specify your variables file name with the -var-file parameter where your variable file name does not carry an extension. この点について次の例で説明します。The following example illustrates this point:

terraform plan -var-file <my-variables-file>

Terraform は、構成ファイルに指定された状態を実現するために必要なアクションを決定します。Terraform determines the actions necessary to achieve the state specified in the configuration file.

Terraform 実行プランの作成

5.Terraform 実行プランを適用する5. Apply the Terraform execution plan

最後のステップでは、terraform apply コマンドを使って、terraform plan コマンドによって生成されたアクションのセットを適用します。The final step of this tutorial is to use the terraform apply command to apply the set of actions generated by the terraform plan command.

最新の実行プランを適用する場合は、次のコマンドを実行します。If you want to apply the latest execution plan, run the following command:

terraform apply

以前に保存した実行プランを適用する場合は、次のコマンドを実行します。If you want to apply a previously saved execution plan, run the following command. プレースホルダーをご使用の環境の適切な値に置き換えます。Replace the placeholders with appropriate values for your environment:

terraform apply <path>

Terraform 実行プランの適用

次のステップNext steps