一貫したオペレーティング システム構成を適用し、 Google Cloud リソース階層全体でコンプライアンスを自動化するには、Terraform を使用して組織レベルで VM Manager を構成します。
このドキュメントでは、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
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
サービス アカウントとカスタムロールの設定
一元化された Terraform 自動化を実行するには、専用のサービス アカウントを作成することをおすすめします。
複数のプロジェクトでこのサービス アカウントに必要な権限を付与するには、組織レベルで IAM カスタムロールを作成します。
serviceusage.services.enableとcompute.projects.setCommonInstanceMetadataを含む組織レベルのカスタムロールを作成します。- 組織レベルやフォルダレベルなど、適用可能な最も低いスコープでカスタムロールをサービス アカウントに付与します。たとえば、ターゲット プロジェクトがすべて特定のフォルダに含まれている場合は、フォルダレベルでロールを付与します。
Terraform を使用して VM Manager を有効にする
VM Manager を有効にして複数のプロジェクトに OS ポリシーを割り当てるには、ゴールデン プロジェクト ブループリントまたは一元化されたプロジェクト管理という自動化されたアプローチのいずれかを使用します。
ゴールデン プロジェクトのブループリントを使用する
組織で標準化された Terraform プロジェクト モジュール(ゴールデン ブループリント)またはプロジェクトをプロビジョニングするための一元的に適用されるメカニズムを使用している場合は、プロジェクト ブループリントに次のリソース定義を追加します。
google_project_servicegoogle_project_service_identitygoogle_project_iam_membergoogle_compute_project_metadata_item
VM Manager を有効にするには、次のサービスとメタデータ リソースを含めます。
# Enable the OS Config API
resource "google_project_service" "osconfig" {
service = "osconfig.googleapis.com"
disable_on_destroy = false
}
# Explicitly provision the OS Config Service Agent
resource "google_project_service_identity" "osconfig_identity" {
provider = google-beta
project = google_project_service.osconfig.project
service = "osconfig.googleapis.com"
}
# Grant the required role to the explicitly provisioned Service Agent
resource "google_project_iam_member" "osconfig_service_agent_binding" {
project = google_project_service.osconfig.project
role = "roles/osconfig.serviceAgent"
member = "serviceAccount:${google_project_service_identity.osconfig_identity.email}"
}
# 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_project_service_identity" "osconfig_identity" {
provider = google-beta
for_each = var.target_projects
project = google_project_service.osconfig[each.key].project
service = "osconfig.googleapis.com"
}
resource "google_project_iam_member" "osconfig_service_agent_binding" {
for_each = var.target_projects
project = google_project_service.osconfig[each.key].project
role = "roles/osconfig.serviceAgent"
member = "serviceAccount:${google_project_service_identity.osconfig_identity[each.key].email}"
}
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_project_service_identity、google_project_iam_member、google_compute_project_metadata_item、google_os_config_os_policy_assignmentリソースをローカル状態に pull します。 - 構成を適用します。標準の 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 のトラブルシューティング。