Terraform を使用して組織全体で VM Manager を設定する

リソース階層全体でオペレーティング システムの構成を統一し、コンプライアンスを自動化するには、Terraform を使用して組織レベルで VM Manager を構成します。 Google Cloud

このドキュメントでは、Terraform を使用して VM Manager(OS Config API)を自動的に有効にし、共通のインスタンス メタデータを設定し、リソース階層内のすべてのターゲット プロジェクトに OS ポリシーを割り当てる方法について説明します。

VM Manager で使用できる Terraform リソースの概要については、 Terraform を使用して VM Manager リソースをプロビジョニングするをご覧ください。

始める前に

始める前に

必要な IAM 権限

複数のプロジェクトで VM Manager を自動的に有効にして OS ポリシーを割り当てるには、Terraform を実行するプリンシパルまたはサービス アカウントに特定の Identity and Access Management(IAM)権限が必要です。

ターゲット プロジェクトの権限

VM Manager サービスを有効にしてプロジェクト メタデータを設定するために必要な権限を取得するには、各ターゲット プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

これらの事前定義ロールには VM Manager サービスを有効にしてプロジェクト メタデータを設定するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

VM Manager サービスを有効にしてプロジェクト メタデータを設定するには、次の権限が必要です。

  • serviceusage.services.enable
  • compute.projects.setCommonInstanceMetadata

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

サービス アカウントとカスタムロールの設定

Google では、集中型の Terraform 自動化を実行するための専用のサービス アカウントを作成することをおすすめします。

複数のプロジェクトでこのサービス アカウントに必要な権限を付与するには、組織レベルで IAM カスタム ロールを作成します。

  1. serviceusage.services.enablecompute.projects.setCommonInstanceMetadata を含む組織レベルのカスタムロールを作成します。
  2. 組織レベルやフォルダレベルなど、適用可能な最も低いスコープでサービス アカウントにカスタムロールを付与します。たとえば、ターゲット プロジェクトがすべて特定のフォルダに含まれている場合は、フォルダレベルでロールを付与します。

Terraform を使用して VM Manager を有効にする

VM Manager を有効にして複数のプロジェクトに OS ポリシーを割り当てるには、ゴールデン プロジェクト設計図または集中型プロジェクト管理のいずれかの自動化アプローチを使用します。

ゴールデン プロジェクト設計図を使用する

組織で標準化された Terraform プロジェクト モジュール(ゴールデン設計図)またはプロジェクトをプロビジョニングするための中央で適用されるメカニズムを使用している場合は、プロジェクト設計図に次のリソース定義を追加します。

VM Manager を有効にするには、次のサービスとメタデータ リソースを含めます。

# Enable the OS Config API
resource "google_project_service" "osconfig" {
  service            = "osconfig.googleapis.com"
  disable_on_destroy = false
}

# Set project metadata to enable VM Manager
resource "google_compute_project_metadata_item" "enable_osconfig" {
  key   = "enable-osconfig"
  value = "TRUE"
}

設計図によってプロビジョニングされたすべての VM に OS ポリシーの割り当てをデプロイするには、次のポリシー割り当てリソースを追加します。

resource "google_os_config_os_policy_assignment" "base_security_policy" {
  name        = "base-security-ospolicy"
  description = "Ensure baseline security agent is installed and operational"
  location    = var.zone

  os_policies {
    id   = "no-op-policy"
    mode = "ENFORCEMENT"

    resource_groups {
      resources {
        id = "sample"
        exec {
          validate {
            interpreter = "SHELL"
            script      = "exit 100"
          }
          enforce {
            interpreter = "SHELL"
            script      = "exit 100"
          }
        }
      }
    }
  }

  os_policies {
    id   = "install-security-agent"
    mode = "ENFORCEMENT"

    resource_groups {
      resources {
        id = "install-agent"
        pkg {
          desired_state = "INSTALLED"
          apt {
            name = "security-agent"
          }
          yum {
            name = "security-agent"
          }
        }
      }
    }
  }

  instance_filter {
    all = true
  }

  rollout {
    disruption_budget {
      percent = 10
    }
    min_wait_duration = "3.5s"
  }
}

すべてのプロジェクトを集中管理する

ゴールデン プロジェクト設計図の変更が適用できない場合は、Terraform の for_each 引数を使用して、複数の既存のプロジェクトで VM Manager の有効化と OS ポリシーの割り当てを一元的に管理できます。

ターゲット プロジェクトで VM Manager を有効にするには、for_each 引数を使用してプロジェクト マップを反復処理します。

resource "google_project_service" "osconfig" {
  for_each           = var.target_projects
  project            = each.key
  service            = "osconfig.googleapis.com"
  disable_on_destroy = false
}

resource "google_compute_project_metadata_item" "enable_osconfig" {
  for_each = var.target_projects
  project  = each.key
  key      = "enable-osconfig"
  value    = "TRUE"
}

ターゲット プロジェクトに OS ポリシーを割り当てるには、for_each 引数を使用してポリシー割り当てリソースを定義します。

resource "google_os_config_os_policy_assignment" "observability_agent_policy" {
  for_each    = var.target_projects
  project     = each.key
  name        = "observability-agent-ospolicy"
  description = "Install Google Cloud Observability agent on CentOS VMs across target projects"
  location    = var.zone

  os_policies {
    id   = "setup-repo-and-install-package-policy"
    mode = "ENFORCEMENT"

    resource_groups {
      inventory_filters {
        os_short_name = "centos"
        os_version    = "8"
      }

      resources {
        id = "setup-repo"
        repository {
          yum {
            id           = "google-cloud-ops-agent"
            display_name = "Google Cloud Ops Agent Repository"
            base_url     = "https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el8-x86_64-all"
            gpg_keys = [
              "https://packages.cloud.google.com/yum/doc/yum-key.gpg",
              "https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg",
            ]
          }
        }
      }

      resources {
        id = "install-pkg"
        pkg {
          desired_state = "INSTALLED"
          yum {
            name = "google-cloud-ops-agent"
          }
        }
      }
    }
  }

  instance_filter {
    all = true
  }

  rollout {
    disruption_budget {
      percent = 10
    }
    min_wait_duration = "3.5s"
  }
}

ターゲット プロジェクトの定義

固定スコープまたは動的スコープを使用して、var.target_projects マップを Terraform 構成に指定できます。

  • 固定スコープ。プロジェクト ID の明示的なリストをローカル変数または外部データファイルに保持します。固定スコープでは、プロジェクトを作成または削除するたびにリストを更新する必要があります。
  • 動的スコープ。リソース階層ルール(組織またはフォルダ内のすべてのプロジェクトなど)に基づいてターゲット プロジェクトを検出します。google_projects データソースを使用してプロジェクトをクエリできます。

     data "google_projects" "in_folder" {
     filter = "parent.id:${local.folder_id}"
     }
    

    例外を処理するには、特定の除外ラベルを含むプロジェクトを除外します。local_exec を使用して外部スクリプトを実行し、Google Cloud CLI コマンド(gcloud asset search-all-resources など)を実行して動的ターゲット リストを生成することもできます。

ステートレスな自動ワークフローを確立する

動的スコープを使用すると、ターゲット プロジェクト リストが常に変化します。 標準の永続的な Terraform 状態ファイルを使用すると、新しいリソースのインポートと状態からの削除されたプロジェクトの削除に手動での作業が必要になります。

動的スコープを効率的に管理するには、Cloud Build を使用してステートレスな自動ワークフローを実装します。

  1. Terraform を初期化します。一時的な非永続的なローカル バックエンドを使用して terraform init を実行します。
  2. ターゲット プロジェクトを検出します。動的スコープの条件に基づいて、ターゲット プロジェクトの現在のリストを生成します。
  3. 既存のリソースをインポートします。terraform import を実行して、既存の google_project_servicegoogle_compute_project_metadata_itemgoogle_os_config_os_policy_assignment リソースをローカル状態にプルします。
  4. 構成を適用します。標準の Terraform コマンド(terraform planterraform apply)を実行し、検出されたプロジェクト リストを宣言に渡します。
  5. 実行アーティファクトを保存します。必要に応じて、監査のためにプランの出力、状態のスナップショット、コピーの概要を Cloud Storage バケットに保存します。

Cloud Build パイプラインを定期的に(毎日、毎週など)実行するようにスケジュールして、構成のドリフトを自動的に検出し、組織全体でコンプライアンスを適用します。

組織レベルの VM Manager ステータスを表示する

組織全体で VM Manager を設定すると、階層内のすべてのプロジェクトで有効化とオペレーティング システムのステータス レポートを表示できます。Cloud Asset Inventory データを BigQuery にエクスポートすると、SQL クエリを実行して VM Manager が有効になっているかどうかを確認し、OS Config エージェントのバージョンを確認し、組織内のすべてのプロジェクトのオペレーティング システムの詳細を確認できます。

データをエクスポートしてステータス レポートのクエリを実行する方法については、Cloud Asset Inventory と BigQuery を使用して組織の VM Manager ステータスを表示するをご覧ください。

次のステップ