Azure のコンプライアンスを理解する第一歩は、リソースの状態を特定することです。 このクイック スタートでは、マネージド ディスクを使用していない仮想マシンを識別するためのポリシー割り当てを作成するプロセスについて説明します。
組み込みのポリシーまたはイニシアティブ定義を割り当てる場合、バージョンの参照は省略可能です。 組み込み定義のポリシー割り当ては既定で最新バージョンになり、特に指定がない限り、マイナー バージョンの変更が自動的に継承されます。
Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダー (Azure など) とクラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、インフラストラクチャの変更をデプロイする前にプレビューできる 実行プラン を作成します。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。
この記事では、次の方法について説明します。
- 現在の Azure クライアント構成を取得します。
- 生成されたランダムな名前を持つ Azure リソース グループを作成します。
- サブスクリプション ポリシーの割り当てを作成して、マネージド ディスクを使用していない仮想マシンを識別する
前提条件
アクティブなサブスクリプションがある Azure アカウントを作成します。 無料でアカウントを作成できます。
Terraform のインストールと構成
Terraform コードを実装する
この記事のサンプル コードは、Azure Terraform GitHub リポジトリにあります。 Terraform の現在および以前のバージョンからのテスト結果を含むログ ファイルを表示できます。 Terraform を使用して Azure リソースを管理する方法を示す 記事とサンプル コード
サンプル Terraform コードをテストして実行するディレクトリを作成し、それを現在のディレクトリにします。
providers.tf
という名前のファイルを作成し、次のコードを挿入します。terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>4.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
main.tf
という名前のファイルを作成し、次のコードを挿入します。# Create a random pet name to ensure unique resource group name resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } # Create a resource group resource "azurerm_resource_group" "example" { ___location = var.resource_group_location name = random_pet.rg_name.id } # Get the current subscription data "azurerm_subscription" "current" {} # Create a subscription policy assignment resource "azurerm_subscription_policy_assignment" "auditvms" { name = "audit-vm-manageddisks" subscription_id = coalesce(var.scope, "/subscriptions/${data.azurerm_subscription.current.subscription_id}") policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d" description = "Shows all virtual machines not using managed disks" display_name = "Audit VMs without managed disks assignment" }
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." } variable "scope" { type = string default = "" description = "Scope of the policy assignment." }
outputs.tf
という名前のファイルを作成し、次のコードを挿入します。output "resource_group_name" { value = azurerm_resource_group.example.name } output "assignment_id" { value = azurerm_subscription_policy_assignment.auditvms.id } output "subscription_id" { value = data.azurerm_subscription.current.subscription_id }
スコープを指定する
スコープによって、ポリシー割り当てを強制するリソースまたはリソースのグループが決まります。 スコープには、管理グループから個々のリソースまで指定できます。 次のいずれかのスコープを使用するには、scope
ファイル内のvariables.tf
変数を更新します。
scope
変数の値を空白のままにすると、"サブスクリプション" スコープが使用されます。
- サブスクリプション:
/subscriptions/<subscription_id>
- リソース グループ:
/subscriptions/<subscription_id>/resourceGroups/<resource_group_name>
- リソース:
/subscriptions/<subscription_id>/resourceGroups/<resource_group_name>/providers/<resource_provider_namespace>/[{parentResourcePath}/]
Terraform を初期化する
重要
4.x azurerm プロバイダーを使用している場合は、Terraform コマンドを実行する前に、Azure に対して認証する Azure サブスクリプション ID を明示的に指定 する必要があります。
azure サブスクリプション ID を providers
ブロックに入れずに指定する 1 つの方法は、 ARM_SUBSCRIPTION_ID
という名前の環境変数にサブスクリプション ID を指定することです。
詳細については、 Azure プロバイダーのリファレンス ドキュメントを参照してください。
terraform init
terraform init -upgrade
のポイント:
-
-upgrade
パラメーターは、必要なプロバイダー プラグインを、構成のバージョン制約に準拠する最新バージョンにアップグレードします。
Terraform 実行プランを作成する
terraform plan を実行して、実行プランを作成します。
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
を呼び出します。
結果を確認する
_assignment\_id_
によって返されるterraform apply
を取得します。次のコマンドを実行して、新しいポリシー割り当ての下で準拠していないリソースを表示します。
armclient post "/subscriptions/<subscription_id>/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$filter=IsCompliant eq false and PolicyAssignmentId eq '<policyAssignmentID>'&$apply=groupby((ResourceId))" > <json file to direct the output with the resource IDs into>
結果は、Azure portal ビューの [非準拠リソース ] に表示される結果と同等です。
リソースをクリーンアップする
Terraform を使用して作成されたリソースが不要になったら、次の手順を実行します。
terraform plan を実行して、
destroy
フラグを指定します。terraform plan -destroy -out main.destroy.tfplan
のポイント:
-
terraform plan
コマンドは実行プランを作成しますが、実行しません。 代わりに、構成ファイルで指定された構成を作成するために必要なアクションが決まります。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが期待と一致するかどうかを確認できます。 - 省略可能な
-out
パラメーターを使用すると、プランの出力ファイルを指定できます。-out
パラメーターを使用すると、確認したプランが適用される内容であることが保証されます。
-
terraform apply を実行して、実行プランを適用します。
terraform apply main.destroy.tfplan
Azure での Terraform のトラブルシューティング
Azure で Terraform を使用する場合の一般的な問題のトラブルシューティング。