1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Google Cloud の Essential Contacts を使用する

Posted at

はじめに

通常 Google Cloud サービスは、ユーザーと重要な情報を共有に、特定の IAM メンバーのアドレスへ通知する
セキュリティ上アカウントのメール機能を OFF にしていたりすると、IAM メンバーがメール受信できないケースがある

エッセンシャル コンタクト (Essential Contacts) を使用する場合、独自の連絡先リストを指定することで、通知を受け取るユーザーをカスタマイズできる

今回、Essential Contacts について確認したことと、実際にラボ設定したのでその内容を記載する

Essential Contacts.png

概要

ドキュメントからの抜粋

必要な API

Essential Contacts API を有効にする必要がある

Essential Contacts API.png

必要な権限

権限内容 ロールの選択で出る名称 事前定義ロール 必要権限
連絡先の閲覧権限 エッセンシャル コンタクトの管理者 roles/essentialcontacts.viewer essentialcontacts.contacts.get
essentialcontacts.contacts.list
連絡先を管理する権限 エッセンシャル コンタクトの閲覧者 roles/essentialcontacts.admin essentialcontacts.contacts.get
essentialcontacts.contacts.list
essentialcontacts.contacts.create
essentialcontacts.contacts.delete
essentialcontacts.contacts.update

Essential_Contacts_事前定義ロール.png

通知のカテゴリ

  • 連絡先は、複数の通知カテゴリに割り当てることができる
  • カテゴリに連絡先を追加しない場合は、フォールバックの連絡先に送信される
  • フォールバックの連絡先を使用せずに、カスタムの連絡先を追加することが推奨されている
  • 個人とグループの両方を連絡先として追加でき、人事異動の影響を減らすため、グループを連絡先が推奨

Essentinal Contacts 通知のカテゴリ.png

具体的なカテゴリとフォールバック先は、ドキュメントの表を参照

連絡先の割り当てに関するベスト プラクティス

通知先は組織で継承され、設定する階層での Google Cloud の推奨 は下記の通り

推奨レベル 通知のカテゴリ
組織 課金
法務
セキュリティ
フォルダ / プロジェクト すべて
プロダクトの更新情報
セキュリティ
停止
技術

設定

下記のような構成になるように設定テストをしたのでその内容を記載する。設定は Terraform で実施する。

Essential_Contacts_Terrform_設定構成.png

API 有効化

対象プロジェクトに対して有効化を実施する

resource "google_project_service" "essentialcontacts_api_enable" {
  service = "essentialcontacts.googleapis.com"
}

通知先ドメインの制限

組織ポリシーで通知先ドメインを制限する

### [重要な連絡先] に追加できるメールアドレスのドメインのセットを定義
resource "google_organization_policy" "essentialcontacts_allowedContactDomains" {
  org_id     = "123456789" # 実環境の組織IDを入れる
  constraint = "essentialcontacts.allowedContactDomains"

  list_policy {
    allow {
      values = "@[email_domain]" # 連絡先メールアドレスのドメインを入れる
    }
  }
}

権限設定

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/data-sources/folder
data "google_folder" "infrastructure_folder" {
  folder              = "123456789123" # 実環境のフォルダIDを入れる
  lookup_organization = true
}

data "google_folder" "service1_folder" {
  folder = "234567891234" # 実環境のフォルダIDを入れる
}
# IAM admin
## https://cloud.google.com/resource-manager/docs/managing-notification-contacts#manage-permissions
resource "google_organization_iam_binding" "org_essentialcontacts_admin" {
  org_id = split("/", data.google_folder.infrastructure_folder.organization)[1]
  role   = "roles/essentialcontacts.admin"

  members = [
    "group:gcp-organization-admin@[domain]", # 実環境 IAM メンバーを入れる
    "serviceAccount:terraform@[terraform-project-id].iam.gserviceaccount.com", # 実環境の Terraform でのサービスアカウントを入れる
  ]
}

# IAM viewer
## https://cloud.google.com/resource-manager/docs/managing-notification-contacts#view-permissions
resource "google_folder_iam_binding" "infra_essentialcontacts_viewer" {
  folder = data.google_folder.infrastructure_folder.id
  role   = "roles/essentialcontacts.viewer"

  members = [
    "group:gcp-network-admin@[domain]", # 実環境 IAM メンバーを入れる
  ]
}

resource "google_folder_iam_binding" "service1_essentialcontacts_viewer" {
  folder = data.google_folder.service1_folder.id
  role   = "roles/essentialcontacts.viewer"

  members = [
    "gcp-service1-admin@[domain]", # 実環境 IAM メンバーを入れる
  ]
}

通知先の設定

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/essential_contacts_contact
# https://cloud.google.com/resource-manager/docs/managing-notification-contacts#terraform
resource "google_essential_contacts_contact" "org_contact" {
  parent                              = data.google_folder.infrastructure_folder.organization
  email                               = "org.admin@xxx.xxx" # 組織管理者の連絡先メールアドレスを入れる
  language_tag                        = "ja"                               # https://cloud.google.com/resource-manager/docs/managing-notification-contacts#expandable-1
  notification_category_subscriptions = ["BILLING", "LEGAL", "SECURITY", ] # ALL, BILLING, LEGAL, PRODUCT_UPDATES, SECURITY, SUSPENSION, TECHNICAL, TECHNICAL_INCIDENTS 
}

resource "google_essential_contacts_contact" "infrastructure_contact" {
  parent                              = data.google_folder.infrastructure_folder.id
  email                               = "gcp-network-admin@xxx.xxx.xxx" # インフラ管理者の連絡先メールアドレスを入れる
  language_tag                        = "ja"
  notification_category_subscriptions = ["ALL", ] # ALL, BILLING, LEGAL, PRODUCT_UPDATES, SECURITY, SUSPENSION, TECHNICAL, TECHNICAL_INCIDENTS 
}

resource "google_essential_contacts_contact" "service1_contact" {
  parent                              = data.google_folder.service1_folder.id
  email                               = "gcp-service1-admin@xxx.xxx.xxx" # サービス1管理者の連絡先メールアドレスを入れる
  language_tag                        = "ja"
  notification_category_subscriptions = ["ALL", ] # ALL, BILLING, LEGAL, PRODUCT_UPDATES, SECURITY, SUSPENSION, TECHNICAL, TECHNICAL_INCIDENTS 
}

テストメール

IAM と管理 > エッセンシャル コンタクト でメールアイコンをクリックすると、テストメール送信ができる

Essential_Contacts_Test_Mail_1.png

Essential_Contacts_Test_Mail_2.png

下記のようなテストメールがくる

Essential_Contacts_Test_Mail_3.png

以上で設定・テスト完了

おわりに

Essential Contacts を使用して、IAM メンバーの連絡先と分離して、Google Cloud サービスの連絡先(メール先)を設定ができた
企業利用などで連絡先の分離・固定やメンバーに依存しない連絡先管理が必要な際に参考になればと思う

github

下記 GitHub で Terraform Code 全体例を記載している

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?