Terraformで組織ポリシーを管理する

Terraformで組織ポリシーを管理する

2026.01.06

はじめに

こんにちは。
クラウド事業本部コンサルティング部の渡邉です。

Google Cloudを利用する上で、セキュリティやガバナンスの観点から組織ポリシーを設定することは非常に重要です。組織ポリシーを利用することで、組織全体に対してリソースの構成を制限し、セキュリティ要件を満たすことができます。
組織ポリシーを設定する際に、どんな組織ポリシーを設定したのか、なぜこの組織ポリシーを変更したのかなどの構成管理を行っていくことがとても重要になります。
今回は、IaCツールのTerraformを使用して組織ポリシーを管理する方法について記載します。

組織ポリシーとは

組織ポリシーとは、Google Cloud組織全体に対してリソースの構成を制限するためのポリシーです。組織管理者は、組織ポリシーを使用してGoogle Cloud環境の利用に関するガードレールを設定することができます。

組織ポリシーを設定することで、以下のようなことが可能になります。

  • Cloud SQLインスタンスへのパブリックIPアクセスの制限
  • Cloud Storageバケットの公開アクセスの防止
  • サービスアカウントキーの作成禁止

組織ポリシーは組織フォルダプロジェクトの階層で設定することができ、上位の階層で設定したポリシーは下位の階層に継承されるのが特徴です。
組織ポリシーの概要や詳細な仕組み、検証に関しては、以前ブログに記載しているのでこちらをご確認頂けると嬉しいです。

https://dev.classmethod.jp/articles/gcp-organization-policies-for-beginners/

https://dev.classmethod.jp/articles/organization-policy-domain-restriction-allowed-vs-managed-policy-members/

Terraformで組織ポリシーを管理するメリット

組織ポリシーをTerraformで管理することで、以下のようなメリットがあります。

  • バージョン管理: Gitなどのバージョン管理システムでポリシーの変更履歴を管理できる
  • コードレビュー: プルリクエストを通じてポリシー変更のレビューが可能
  • 再現性: 同じ設定を複数の環境に適用できる
  • ドキュメント化: コードとしてポリシーが記載されるため、設定内容が明確になる

やってみた

ディレクトリ構成

今回のTerraformコードのディレクトリ構成は以下のとおりです。

$ tree -l
.
├── org_policy.tf
├── backend.tf
├── provider.tf
├── variable.tf
└── versions.tf

versions.tf

Terraformのバージョンと必要なプロバイダーを定義します。

versions.tf
terraform {
  required_version = ">= 1.12.0"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = ">= 7.0.0"
    }
  }
}

backend.tf

tfstateを保存するためのGCSバケットのバケット名とプレフィックスを定義します。

backend.tf
terraform {
  backend "gcs" {
    bucket = "xxxxxxxxxxxxxxx"
    prefix = "orgpolicy/tfstate"
  }
}

provider.tf

Google Cloudプロバイダーの設定を行います。

provider.tf
provider "google" {
  project               = var.project_id
  region                = var.region
  user_project_override = true
  billing_project       = var.project_id
}

variable.tf

変数を定義します。

variable.tf
variable "project_id" {
  description = "Google Cloud プロジェクトID"
  type        = string
}

variable "organization_domain" {
  description = "Google Cloud 組織ドメイン"
  type        = string
}

variable "region" {
  description = "Google Cloud リージョン"
  type        = string
  default     = "asia-northeast1"
}

org_policy.tf

組織ポリシーを定義します。
今回は、自身のGoogle Cloud組織のセキュリティ強化のために8つの組織ポリシーを設定していきます。

デフォルトで設定されている組織ポリシーをimport block機能でterraform管理としたかったのですが、以下の理由で見送りました。

org_policy.tf
data "google_organization" "org" {
  domain = var.organization_domain
}

## Cloud SQL インスタンスへのパブリック IP アクセスを制限する
resource "google_org_policy_policy" "sql_publicip_policy" {
  name   = "organizations/${data.google_organization.org.org_id}/policies/sql.restrictPublicIp"
  parent = "organizations/${data.google_organization.org.org_id}"

  spec {
    rules {
      enforce = "TRUE"
    }
  }
}

## デフォルトのネットワーク作成をスキップ
resource "google_org_policy_policy" "default_network_policy" {
  name   = "organizations/${data.google_organization.org.org_id}/policies/compute.skipDefaultNetworkCreation"
  parent = "organizations/${data.google_organization.org.org_id}"

  spec {
    rules {
      enforce = "TRUE"
    }
  }
}

## 公開アクセス防止の実施
resource "google_org_policy_policy" "public_access_policy" {
  name   = "organizations/${data.google_organization.org.org_id}/policies/storage.publicAccessPrevention"
  parent = "organizations/${data.google_organization.org.org_id}"

  spec {
    rules {
      enforce = "TRUE"
    }
  }
}

## デフォルトのサービス アカウントの特権基本ロールを禁止する
resource "google_org_policy_policy" "sa_basic_role_policy" {
  name   = "organizations/${data.google_organization.org.org_id}/policies/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts"
  parent = "organizations/${data.google_organization.org.org_id}"

  spec {
    rules {
      enforce = "TRUE"
    }
  }
}

## Cloud Storage で統一バケットレベルアクセス(IAMのみ)を強制
resource "google_org_policy_policy" "uniform_bucket_level_access_policy" {
  name   = "organizations/${data.google_organization.org.org_id}/policies/storage.uniformBucketLevelAccess"
  parent = "organizations/${data.google_organization.org.org_id}"

  spec {
    rules {
      enforce = "TRUE"
    }
  }
}

## IAMポリシーに追加可能なメンバーを組織内に限定
resource "google_org_policy_policy" "allowed_policy_members" {
  name   = "organizations/${data.google_organization.org.org_id}/policies/iam.managed.allowedPolicyMembers"
  parent = "organizations/${data.google_organization.org.org_id}"

  spec {
    rules {
      enforce = "TRUE"
      parameters = jsonencode({
        allowedPrincipalSets = [
          "//cloudresourcemanager.googleapis.com/organizations/${data.google_organization.org.org_id}"
        ]
      })
    }
  }
}

## サービスアカウントキー(JSONキー)の新規作成を禁止
resource "google_org_policy_policy" "disable_sa_key_creation" {
  name   = "organizations/${data.google_organization.org.org_id}/policies/iam.managed.disableServiceAccountKeyCreation"
  parent = "organizations/${data.google_organization.org.org_id}"

  spec {
    rules {
      enforce = "TRUE"
    }
  }
}

## 外部で作成したサービスアカウントキーのアップロードを禁止
resource "google_org_policy_policy" "disable_sa_key_upload" {
  name   = "organizations/${data.google_organization.org.org_id}/policies/iam.managed.disableServiceAccountKeyUpload"
  parent = "organizations/${data.google_organization.org.org_id}"

  spec {
    rules {
      enforce = "TRUE"
    }
  }
}

設定している組織ポリシー

今回設定している8つの組織ポリシーについて解説します。

組織ポリシー 説明
sql.restrictPublicIp Cloud SQLインスタンスへのパブリックIPアクセスを制限する。Cloud SQLインスタンスにパブリックIPアドレスを付与することができなくなり、インターネットからの直接アクセスを防止できる。
compute.skipDefaultNetworkCreation 新規プロジェクト作成時にデフォルトのVPCネットワークの作成をスキップする。デフォルトネットワークには緩いファイアウォールルールが設定されているため、セキュリティ上の観点から自動作成を無効化することが推奨される。
storage.publicAccessPrevention Cloud Storageバケットの公開アクセスを防止する。バケットやオブジェクトを一般公開することができなくなり、意図しないデータ漏洩を防止できる。
iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts デフォルトのサービスアカウントに対する特権基本ロール(Owner、Editor)の付与を禁止する。デフォルトサービスアカウントに過剰な権限を付与することはセキュリティリスクとなるため、このポリシーで制限することが推奨される。
storage.uniformBucketLevelAccess Cloud Storageで統一バケットレベルアクセス(IAMのみ)を強制する。ACL(アクセス制御リスト)とIAMの両方でアクセス制御を行うと管理が複雑になるため、IAMのみでアクセス制御を行うことが推奨される。
iam.managed.allowedPolicyMembers IAMポリシーに追加可能なメンバーを組織内に限定する。組織外のユーザーやサービスアカウントにIAMロールを付与することができなくなり、意図しない外部アクセスを防止できる。
iam.managed.disableServiceAccountKeyCreation サービスアカウントキー(JSONキー)の新規作成を禁止する。サービスアカウントキーは漏洩リスクが高いため、Workload Identity連携などの代替手段を使用することが推奨される。
iam.managed.disableServiceAccountKeyUpload 外部で作成したサービスアカウントキーのアップロードを禁止する。外部で作成されたキーは管理が困難なため、このポリシーで制限することが推奨される。

Terraformコードの工夫ポイント

今回のTerraformコードでは、以下の点を工夫しています。

1. data sourceによる組織IDの動的取得

data "google_organization" "org" {
  domain = var.organization_domain
}

組織IDを直接ハードコードするのではなく、google_organization data sourceを使用してドメイン名から動的に取得しています。これにより、以下のメリットがあります。

  • 可読性の向上: 数字の羅列である組織IDよりも、ドメイン名の方が直感的に理解しやすい
  • 移植性の向上: 異なる組織に同じコードを適用する際、変数の値を変更するだけで対応可能
  • セキュリティ: 組織IDをコードに直接記載しないことで、リポジトリ公開時のリスクを軽減

2. jsonencode関数によるパラメータのエンコード

parameters = jsonencode({
  allowedPrincipalSets = [
    "//cloudresourcemanager.googleapis.com/organizations/${data.google_organization.org.org_id}"
  ]
})

iam.managed.allowedPolicyMembersのようなマネージド制約では、parametersにJSON形式でパラメータを渡す必要があります。jsonencode()関数を使用することで、HCLのマップ/リスト構文から正しいJSON文字列に変換しています。これにより、JSONの構文エラーを防ぎ、Terraformの変数展開も正しく機能します。

3. GCSバックエンドによるtfstate管理

terraform {
  backend "gcs" {
    bucket = "xxxxxxxxxxxxxxx"
    prefix = "orgpolicy/tfstate"
  }
}

tfstateファイルをGCSバケットで管理することで、以下のメリットがあります。

  • チーム開発対応: 複数人で同じインフラを管理する際に状態の競合を防止
  • 状態のバックアップ: GCSのバージョニング機能と組み合わせることで、tfstateの履歴管理が可能
  • セキュリティ: ローカルに機密情報を含むtfstateを保持しない

4. user_project_overrideとbilling_projectの設定

provider "google" {
  project               = var.project_id
  region                = var.region
  user_project_override = true
  billing_project       = var.project_id
}

組織レベルのリソースを操作する際、APIの呼び出しに対する課金先プロジェクトを明示的に指定しています。user_project_override = truebilling_projectを設定することで、組織ポリシーAPI等の呼び出しが指定したプロジェクトに課金されるようになります。これにより、「Cloud Resource Manager API has not been used in project」といったエラーを回避できます。

デプロイ手順

前提条件

組織ポリシーをTerraformで設定するためには、以下のIAMロールが作業ユーザ、またはサービスアカウントに必要です。

  • 組織ポリシー管理者:roles/orgpolicy.policyAdmin

デプロイの実行

terraform init

まずはterraform initコマンドを実行して初期化処理をしていきます。

$ terraform init
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of hashicorp/google from the dependency lock file
- Using previously-installed hashicorp/google v7.14.1

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

terraform plan

次に、terraform planコマンドを実行して実行計画を確認していきます。

$ terraform plan -var project_id=your-project-id -var organization_domain=your-domain.example.com
data.google_organization.org: Reading...
data.google_organization.org: Read complete after 1s [id=organizations/123456789012]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_org_policy_policy.allowed_policy_members will be created
  + resource "google_org_policy_policy" "allowed_policy_members" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/iam.managed.allowedPolicyMembers"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce    = "TRUE"
              + parameters = jsonencode(
                    {
                      + allowedPrincipalSets = [
                          + "//cloudresourcemanager.googleapis.com/organizations/123456789012",
                        ]
                    }
                )
            }
        }
    }

  # google_org_policy_policy.default_network_policy will be created
  + resource "google_org_policy_policy" "default_network_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/compute.skipDefaultNetworkCreation"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.disable_sa_key_creation will be created
  + resource "google_org_policy_policy" "disable_sa_key_creation" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/iam.managed.disableServiceAccountKeyCreation"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.disable_sa_key_upload will be created
  + resource "google_org_policy_policy" "disable_sa_key_upload" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/iam.managed.disableServiceAccountKeyUpload"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.public_access_policy will be created
  + resource "google_org_policy_policy" "public_access_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/storage.publicAccessPrevention"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.sa_basic_role_policy will be created
  + resource "google_org_policy_policy" "sa_basic_role_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.sql_publicip_policy will be created
  + resource "google_org_policy_policy" "sql_publicip_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/sql.restrictPublicIp"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.uniform_bucket_level_access_policy will be created
  + resource "google_org_policy_policy" "uniform_bucket_level_access_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/storage.uniformBucketLevelAccess"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

Plan: 8 to add, 0 to change, 0 to destroy.

─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

設定したい8つの組織ポリシーが追加される実行計画が表示されました。
問題ないため、実行計画を適用していきます。

terraform apply

最後にterraform applyコマンドを実行して実行計画を適用していきます。

$ terraform apply -var project_id=your-project-id -var organization_domain=your-domain.example.com
data.google_organization.org: Reading...
data.google_organization.org: Read complete after 1s [id=organizations/123456789012]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_org_policy_policy.allowed_policy_members will be created
  + resource "google_org_policy_policy" "allowed_policy_members" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/iam.managed.allowedPolicyMembers"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce    = "TRUE"
              + parameters = jsonencode(
                    {
                      + allowedPrincipalSets = [
                          + "//cloudresourcemanager.googleapis.com/organizations/123456789012",
                        ]
                    }
                )
            }
        }
    }

  # google_org_policy_policy.default_network_policy will be created
  + resource "google_org_policy_policy" "default_network_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/compute.skipDefaultNetworkCreation"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.disable_sa_key_creation will be created
  + resource "google_org_policy_policy" "disable_sa_key_creation" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/iam.managed.disableServiceAccountKeyCreation"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.disable_sa_key_upload will be created
  + resource "google_org_policy_policy" "disable_sa_key_upload" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/iam.managed.disableServiceAccountKeyUpload"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.public_access_policy will be created
  + resource "google_org_policy_policy" "public_access_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/storage.publicAccessPrevention"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.sa_basic_role_policy will be created
  + resource "google_org_policy_policy" "sa_basic_role_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.sql_publicip_policy will be created
  + resource "google_org_policy_policy" "sql_publicip_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/sql.restrictPublicIp"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

  # google_org_policy_policy.uniform_bucket_level_access_policy will be created
  + resource "google_org_policy_policy" "uniform_bucket_level_access_policy" {
      + etag   = (known after apply)
      + id     = (known after apply)
      + name   = "organizations/123456789012/policies/storage.uniformBucketLevelAccess"
      + parent = "organizations/123456789012"

      + spec {
          + etag        = (known after apply)
          + update_time = (known after apply)

          + rules {
              + enforce = "TRUE"
            }
        }
    }

Plan: 8 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

google_org_policy_policy.uniform_bucket_level_access_policy: Creating...
google_org_policy_policy.disable_sa_key_creation: Creating...
google_org_policy_policy.allowed_policy_members: Creating...
google_org_policy_policy.sql_publicip_policy: Creating...
google_org_policy_policy.sa_basic_role_policy: Creating...
google_org_policy_policy.disable_sa_key_upload: Creating...
google_org_policy_policy.default_network_policy: Creating...
google_org_policy_policy.public_access_policy: Creating...
google_org_policy_policy.default_network_policy: Creation complete after 2s [id=organizations/123456789012/policies/compute.skipDefaultNetworkCreation]
google_org_policy_policy.uniform_bucket_level_access_policy: Creation complete after 2s [id=organizations/123456789012/policies/storage.uniformBucketLevelAccess]
google_org_policy_policy.public_access_policy: Creation complete after 2s [id=organizations/123456789012/policies/storage.publicAccessPrevention]
google_org_policy_policy.sql_publicip_policy: Creation complete after 3s [id=organizations/123456789012/policies/sql.restrictPublicIp]
google_org_policy_policy.allowed_policy_members: Creation complete after 3s [id=organizations/123456789012/policies/iam.managed.allowedPolicyMembers]
google_org_policy_policy.disable_sa_key_upload: Creation complete after 3s [id=organizations/123456789012/policies/iam.managed.disableServiceAccountKeyUpload]
google_org_policy_policy.sa_basic_role_policy: Creation complete after 3s [id=organizations/123456789012/policies/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts]
google_org_policy_policy.disable_sa_key_creation: Creation complete after 3s [id=organizations/123456789012/policies/iam.managed.disableServiceAccountKeyCreation]

Apply complete! Resources: 8 added, 0 changed, 0 destroyed.

正常に8つの組織ポリシーが適用することができました。

最後にgcloud resource-manager org-policies listコマンドを実行してterraformで設定した組織ポリシーがきちんと適用されているのか確認していきます。

$ gcloud resource-manager org-policies list --organization=123456789012
CONSTRAINT: constraints/sql.restrictPublicIp
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: CMP07soGEPDShvQB

CONSTRAINT: constraints/storage.uniformBucketLevelAccess
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: CMP07soGEOinsfQB

CONSTRAINT: constraints/compute.skipDefaultNetworkCreation
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: CMP07soGEICeiPQB

CONSTRAINT: constraints/storage.publicAccessPrevention
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: CMP07soGELDT8fMB

CONSTRAINT: constraints/iam.managed.allowedPolicyMembers
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: CMP07soGEIDcockB

CONSTRAINT: constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: CNf07soGEIDsp9sD

CONSTRAINT: constraints/iam.managed.disableServiceAccountKeyCreation
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: CNf07soGENjp2NED

CONSTRAINT: constraints/iam.managed.disableServiceAccountKeyUpload
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: CMP07soGEJCQ-MsB

正常に8つの組織ポリシーが適用されていることが確認できました。

最後に

今回は、Terraformを使用して組織ポリシーを管理する方法について記載しました。

組織ポリシーをコードとして管理することで、ポリシーの変更履歴を追跡でき、レビュープロセスを経た安全な変更が可能になります。また、セキュリティ強化のためのポリシーを組織全体に適用することで、Google Cloud環境のガバナンスを強化することができます。

組織ポリシーは組織のセキュリティ要件に応じて追加・変更することができますので、今回紹介したポリシーを参考に、自組織に適したポリシーを検討していただければと思います。
また、Github ActionsやCloud BuildでCI/CDパイプラインを構築して運用することで、組織ポリシーの作成・変更・削除を自動化することもできますので、実際に組織ポリシーをterraformで管理する場合は、こちらも検討いただくとよいと思います。

この記事が誰かの助けになれば幸いです。

以上、クラウド事業本部コンサルティング部の渡邉でした!

この記事をシェアする

FacebookHatena blogX

関連記事