リソース階層全体でオペレーティング システムの構成を統一し、コンプライアンスを自動化するには、Terraform を使用して組織レベルで VM Manager を構成します。 Google Cloud
このドキュメントでは、Terraform を使用して VM Manager(OS Config API)を自動的に有効にし、共通のインスタンス メタデータを設定し、リソース階層内のすべてのターゲット プロジェクトに OS ポリシーを割り当てる方法について説明します。
VM Manager で使用できる Terraform リソースの概要については、 Terraform を使用して VM Manager リソースをプロビジョニングするをご覧ください。
始める前に
-
まだ設定していない場合は、認証を設定します。認証では、 Google Cloud サービスと API にアクセスするための ID が確認されます。ローカル開発環境からコードまたはサンプルを実行するには、次のいずれかのオプションを選択して Compute Engine に対する認証を行います。
ローカル開発環境でこのページの Terraform サンプルを使用するには、gcloud CLI をインストールして 初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず フェデレーション ID を使用して gcloud CLI にログインする必要があります。
-
ローカルシェルを使用している場合は、ユーザー アカウントのローカル認証情報を作成します。
gcloud auth application-default login
Cloud Shell を使用している場合は、この操作を行う必要はありません。
認証エラーが返され、外部 ID プロバイダ (IdP)を使用している場合は、連携 ID を使用して gcloud CLI にログインしていることを確認します。
詳細については、 ローカル開発環境の認証を設定するをご覧ください。
-
始める前に
- VM Manager の 設定の概要を確認します。
- OS Config の割り当てを確認します。
- Terraform 環境を準備します。
必要な IAM 権限
複数のプロジェクトで VM Manager を自動的に有効にして OS ポリシーを割り当てるには、Terraform を実行するプリンシパルまたはサービス アカウントに特定の Identity and Access Management(IAM)権限が必要です。
ターゲット プロジェクトの権限
VM Manager サービスを有効にしてプロジェクト メタデータを設定するために必要な権限を取得するには、各ターゲット プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
- Service Usage 管理者 (
roles/serviceusage.serviceUsageAdmin) - Compute インスタンス管理者(v1) (
roles/compute.instanceAdmin.v1)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには VM Manager サービスを有効にしてプロジェクト メタデータを設定するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
VM Manager サービスを有効にしてプロジェクト メタデータを設定するには、次の権限が必要です。
-
serviceusage.services.enable -
compute.projects.setCommonInstanceMetadata
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
サービス アカウントとカスタムロールの設定
Google では、集中型の Terraform 自動化を実行するための専用のサービス アカウントを作成することをおすすめします。
複数のプロジェクトでこのサービス アカウントに必要な権限を付与するには、組織レベルで IAM カスタム ロールを作成します。
serviceusage.services.enableとcompute.projects.setCommonInstanceMetadataを含む組織レベルのカスタムロールを作成します。- 組織レベルやフォルダレベルなど、適用可能な最も低いスコープでサービス アカウントにカスタムロールを付与します。たとえば、ターゲット プロジェクトがすべて特定のフォルダに含まれている場合は、フォルダレベルでロールを付与します。
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 を使用してステートレスな自動ワークフローを実装します。
- Terraform を初期化します。一時的な非永続的なローカル バックエンドを使用して
terraform initを実行します。 - ターゲット プロジェクトを検出します。動的スコープの条件に基づいて、ターゲット プロジェクトの現在のリストを生成します。
- 既存のリソースをインポートします。
terraform importを実行して、既存のgoogle_project_service、google_compute_project_metadata_item、google_os_config_os_policy_assignmentリソースをローカル状態にプルします。 - 構成を適用します。標準の Terraform コマンド(
terraform planとterraform apply)を実行し、検出されたプロジェクト リストを宣言に渡します。 - 実行アーティファクトを保存します。必要に応じて、監査のためにプランの出力、状態のスナップショット、コピーの概要を Cloud Storage バケットに保存します。
Cloud Build パイプラインを定期的に(毎日、毎週など)実行するようにスケジュールして、構成のドリフトを自動的に検出し、組織全体でコンプライアンスを適用します。
組織レベルの VM Manager ステータスを表示する
組織全体で VM Manager を設定すると、階層内のすべてのプロジェクトで有効化とオペレーティング システムのステータス レポートを表示できます。Cloud Asset Inventory データを BigQuery にエクスポートすると、SQL クエリを実行して VM Manager が有効になっているかどうかを確認し、OS Config エージェントのバージョンを確認し、組織内のすべてのプロジェクトのオペレーティング システムの詳細を確認できます。
データをエクスポートしてステータス レポートのクエリを実行する方法については、Cloud Asset Inventory と BigQuery を使用して組織の VM Manager ステータスを表示するをご覧ください。
次のステップ
- Cloud Asset Inventory と BigQuery を使用して組織の VM Manager ステータスを表示する。
- OS ポリシーの割り当てを作成する。
- パッチジョブを作成する。
- VM Manager のトラブルシューティング。