このクイック スタートでは、Terraform を使用して、Azure Batch アカウント、Azure Storage アカウント、および 2 つの Batch プールを作成します。 Batch は、大量のデータの処理を並列化して多数のコンピューターに分散させるクラウドベースのジョブ スケジューリング サービスです。 通常は、パラメーター スイープ、モンテ カルロ シミュレーション、財務リスクのモデリング、その他のハイ パフォーマンス コンピューティング アプリケーションに使用されます。 Batch アカウントは、プール、ジョブ、タスクへのアクセスを提供する Batch サービスの最上位リソースです。 ストレージ アカウントは、Batch サービスによって使用および生成されるすべてのファイルを格納および管理するために使用され、2 つの Batch プールはタスクを実行するコンピューティング ノードのコレクションです。
Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、デプロイが可能になります。 Terraform を使用して、 HCL 構文を使用して構成ファイルを作成します。 HCL 構文では、Azure などのクラウド プロバイダーと、クラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、インフラストラクチャの変更をデプロイする前にプレビューできる 実行プラン を作成します。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。
- Terraform の必要なバージョンと必要なプロバイダーを指定します。
- 追加機能を使用せずに Azure プロバイダーを定義します。
- リソース グループの場所とリソース グループ名のプレフィックスの変数を定義します。
- 指定されたプレフィックスを使用して、リソース グループのランダムな名前を生成します。
- 指定した場所に、生成された名前で Azure リソース グループを作成します。
- ストレージ アカウントの名前として使用するランダムな文字列を生成します。
- 生成された名前を持つストレージ アカウントを、作成したリソース グループ内の同じ場所に、標準アカウント レベルの、ローカル冗長ストレージ レプリケーションの種類で作成します。
- Batch アカウントの名前として使用する別のランダムな文字列を生成します。
- 生成された名前を持つ Batch アカウントを、作成したリソース グループ内の同じ場所に作成し、作成したストレージ アカウントにストレージ キー認証モードでリンクします。
- "pool" プレフィックスを持つ Batch プールのランダムな名前を生成します。
- 作成したリソース グループに、生成された名前を使用して固定スケールの Batch プールを作成します。これは、作成した Batch アカウントにリンクし、標準の A1 仮想マシン (VM) サイズで、Ubuntu 22.04 ノード エージェント SKU と、最大 1 回の再試行で "Hello World from $env" をエコーし、成功を待機する開始タスクを使用します。
- 作成したリソース グループに、同じ生成された名前を使用して、自動スケールで別の Batch プールを作成します。これは、作成された Batch アカウントにリンクされ、標準の A1 VM サイズで、Ubuntu 22.04 ノード エージェント SKU と、自動スケール式を使用します。
- 作成されたリソース グループ、ストレージ アカウント、Batch アカウント、両方の Batch プールの名前を出力します。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウントを作成します。 アカウントは無料で作成できます。
- Terraform をインストールして構成します。
Terraform コードを実装する
注意
この記事のサンプル コードは、 Azure Terraform GitHub リポジトリにあります。 Terraform の現在および以前のバージョンからのテスト結果を含むログ ファイルを表示できます。
Terraform を使用して Azure リソースを管理する方法を示すその他の記事とサンプル コードを参照してください。
サンプル Terraform コードをテストして実行するディレクトリを作成し、それを現在のディレクトリにします。
main.tfという名前のファイルを作成し、次のコードを挿入します。resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = random_pet.rg_name.id } resource "random_string" "storage_account_name" { length = 8 lower = true numeric = false special = false upper = false } resource "azurerm_storage_account" "example" { name = random_string.storage_account_name.result resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location account_tier = "Standard" account_replication_type = "LRS" } resource "random_string" "batch_account_name" { length = 8 lower = true numeric = false special = false upper = false } resource "azurerm_batch_account" "example" { name = random_string.batch_account_name.result resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location storage_account_id = azurerm_storage_account.example.id storage_account_authentication_mode = "StorageKeys" } resource "random_pet" "azurerm_batch_pool_name" { prefix = "pool" } resource "azurerm_batch_pool" "fixed" { name = "${random_pet.azurerm_batch_pool_name.id}-fixed-pool" resource_group_name = azurerm_resource_group.rg.name account_name = azurerm_batch_account.example.name display_name = "Fixed Scale Pool" vm_size = "Standard_A1" node_agent_sku_id = "batch.node.ubuntu 22.04" fixed_scale { target_dedicated_nodes = 2 resize_timeout = "PT15M" } storage_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts" version = "latest" } start_task { command_line = "echo 'Hello World from $env'" task_retry_maximum = 1 wait_for_success = true common_environment_properties = { env = "TEST" } user_identity { auto_user { elevation_level = "NonAdmin" scope = "Task" } } } metadata = { "tagName" = "Example tag" } } resource "azurerm_batch_pool" "autopool" { name = "${random_pet.azurerm_batch_pool_name.id}-autoscale-pool" resource_group_name = azurerm_resource_group.rg.name account_name = azurerm_batch_account.example.name display_name = "Auto Scale Pool" vm_size = "Standard_A1" node_agent_sku_id = "batch.node.ubuntu 22.04" auto_scale { evaluation_interval = "PT15M" formula = <<EOF startingNumberOfVMs = 1; maxNumberofVMs = 25; pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second); pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second)); $TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples); EOF } storage_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts" version = "latest" } }outputs.tfという名前のファイルを作成し、次のコードを挿入します。output "resource_group_name" { value = azurerm_resource_group.rg.name } output "storage_account_name" { value = azurerm_storage_account.example.name } output "batch_account_name" { value = azurerm_batch_account.example.name } output "batch_pool_fixed_name" { value = azurerm_batch_pool.fixed.name } output "batch_pool_autopool_name" { value = azurerm_batch_pool.autopool.name }providers.tfという名前のファイルを作成し、次のコードを挿入します。terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }variables.tfという名前のファイルを作成し、次のコードを挿入します。variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." }
Terraform を初期化する
terraform init
terraform init -upgrade
重要なポイント:
-
-upgradeパラメーターは、必要なプロバイダー プラグインを、構成のバージョン制約に準拠する最新バージョンにアップグレードします。
Terraform 実行プランを作成する
terraform プランを実行して実行プランを作成します。
terraform plan -out main.tfplan
重要なポイント:
-
terraform planコマンドは、実行プランを作成しますが、実行はしません。 代わりに、構成ファイルに指定された構成を作成するために必要なアクションを決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。 - 省略可能な
-outパラメーターを使用すると、プランの出力ファイルを指定できます。-outパラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。
Terraform 実行プランを適用する
terraform apply を実行して、実行プランをクラウド インフラストラクチャに適用します。
terraform apply main.tfplan
重要なポイント:
-
terraform applyコマンドの例は、以前にterraform plan -out main.tfplanが実行されたことを前提としています。 -
-outパラメーターに別のファイル名を指定した場合は、terraform applyの呼び出しで同じファイル名を使用します。 -
-outパラメーターを使用しなかった場合は、パラメーターを指定せずにterraform applyを呼び出します。
結果を確認する
az batch account show を実行して Batch アカウントを表示します。
az batch account show --name <batch_account_name> --resource-group <resource_group_name>
<batch_account_name> を Batch アカウントの名前に、<resource_group_name> をリソース グループの名前に置き換えます。
リソースをクリーンアップする
Terraform を使用して作成したリソースが不要になった場合は、次の手順を実行します。
terraform プランを実行し、
destroyフラグを指定します。terraform plan -destroy -out main.destroy.tfplan重要なポイント:
-
terraform planコマンドは、実行プランを作成しますが、実行はしません。 代わりに、構成ファイルに指定された構成を作成するために必要なアクションを決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。 - 省略可能な
-outパラメーターを使用すると、プランの出力ファイルを指定できます。-outパラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。
-
terraform apply を実行して実行プランを適用します。
terraform apply main.destroy.tfplan
Azure での Terraform のトラブルシューティング
Azure で Terraform を使用する場合の一般的な問題のトラブルシューティングを行います。