Google Cloud の土台

リソース階層と請求

Google Cloud のリソースは組織、フォルダ、プロジェクトの階層に置かれ、上で設定した権限とポリシーは下に引き継がれます。プロジェクトは環境とアプリの単位で分け、請求先アカウントは階層の外から各プロジェクトに紐づけます。

Google Cloud のリソースは、組織、フォルダ、プロジェクトのどこかに属し、組織やフォルダに付けた IAM の権限と組織ポリシーは下のすべてに引き継がれます。料金を払う請求先アカウント (Cloud Billing アカウント) は階層の外にあり、プロジェクトごとに紐づけます。設計の問題で最初に決めるのは、プロジェクトをどの単位で分け、フォルダでどうまとめるかです。

上の層で付けた設定は、下のすべてに届く

組織example.comフォルダ本番フォルダ開発プロジェクトshop-prodプロジェクトshop-devVMバケットVMバケット設定は下へ継承
組織以外のリソースは親を 1 つだけ持つ。組織やフォルダに付けた権限とポリシーは、その下のすべてに届く。

これを継承と呼びます。開発フォルダで開発者のグループに Compute Engine の管理者ロールを付ければ、配下の全プロジェクトで VM を管理できます。プロジェクトは別のフォルダへ移せますが、親は常に 1 つです。継承の細かい規則は IAM の基本で扱います。

層役割作る条件と上限
組織最上位。組織ポリシーと全社共通の権限を置くGoogle Workspace か Cloud Identity のアカウントが必要。1 アカウントに 1 つ
フォルダ部門や環境ごとにプロジェクトをまとめる組織が必要。入れ子は 10 階層、1 つの親の直下に 300 個まで
プロジェクトAPI の有効化、権限、割り当て、課金の単位組織がなくても作れる
リソースVM、バケット、データベースなどの実体必ずどれかのプロジェクトに属する

演習で使う個人のアカウントには組織がなく、フォルダも組織ポリシーも使えません。試験は組織がある前提なので、継承の動きは下のシミュレーターで確かめます。

試す設定はどこまで引き継がれるか

shop-batch を置くフォルダ
組織本番フォルダshop-prodshop-batch開発フォルダ開発者権限shop-dev開発者権限

塗りつぶした札はその箱に直接付けた設定、枠だけの札は上から引き継いだ設定です。

「開発者権限」は開発フォルダに付いているので、その下の shop-dev すべてに引き継がれます。

shop-batch は本番フォルダの下にあり、引き継ぐ設定はありません。

参考: リソース階層 (公式)

プロジェクトは ID、名前、番号で識別される

gcloud やリソースの URL で使うのはプロジェクト ID です。

識別子決め方後から変更一意性
プロジェクト ID英小文字、数字、ハイフンで 6〜30 文字できない世界で一意。削除後も再利用できない
プロジェクト名4〜30 文字の表示名できる重複してよい
プロジェクト番号自動で振られるできない一意

汎用の ID は埋まっているので、会社名-アプリ名-環境 の形で決めます。

参考: プロジェクトの作成と管理 (公式)

請求先アカウントは階層の外にあり、支払いの権限を分けられる

リソース階層組織プロジェクトshop-prodプロジェクトshop-dev請求先アカウント支払い方法経理が管理紐づけ
1 つの請求先アカウントに複数のプロジェクトがつながり、1 つのプロジェクトがつながる請求先は 1 つだけ。支払いの権限はリソースの権限と別に付ける。

紐づいたプロジェクトの利用料は、その請求先アカウントに積み上がります。プロジェクトのオーナーでも、請求先アカウントの管理者ロールがなければ支払い方法は変えられません。経理には請求先アカウントのロールだけを、開発者にはプロジェクトのロールだけを付けます。予算とアラートも請求先アカウントに設定し、プロジェクトやラベルで範囲を絞れます。学習用の環境を作るで設定したのがこれです。

プロジェクトはアプリと環境の組み合わせで分ける

本番と開発を 1 つのプロジェクトに置くと、開発者の権限が本番にも効きます。迷ったら「アプリごと、環境ごとに 1 プロジェクト」にし、ポリシーをまとめて付けたい単位でフォルダを作ります。本番フォルダに「外部 IP を持つ VM を禁止する」組織ポリシーを付ければ、本番のプロジェクトが増えても同じ制約がかかります。全社で本番だけを厳しくしたいなら、部門より先に環境でフォルダを切ります。ネットワークやログのように共有するものは専用のプロジェクトに置きます。Shared VPC は VPC の設計で扱います。

ラベルで費用を分け、タグでポリシーを分ける

ラベルはリソースに付けるキーと値の組で、1 つのリソースに 64 個まで付けられます。キーと値は 63 文字以内の英小文字、数字、アンダースコア、ハイフンです。ラベルは請求データに引き継がれるので、team=payments を付ければプロジェクトの中でもチームごとに費用を集計できます。ラベルはポリシーの条件に使えないので、「env=prod のリソースだけにファイアウォールルールを効かせる」ような条件にはタグを使います。

参考: ラベルの概要 (公式)

オンプレミスの設備投資 (CapEx) と違い、Google Cloud は使った分を月ごとに払う運用費 (OpEx) が基本で、部署ごとの費用がプロジェクトとラベルの単位で毎月見えます。試験のセクション 4.2 はこの移行を事業側の視点で問います。

試してみる

学習用の環境を作るで作ったプロジェクトを Cloud Shell から調べ、バケットにラベルを付けます。

PROJECT_ID=$(gcloud config get-value project)

# ID、名前、番号を確認する
gcloud projects describe "$PROJECT_ID"

# 親を表示する。組織がなければプロジェクト自身だけが出る
gcloud projects get-ancestors "$PROJECT_ID"

# 紐づいている請求先アカウントを確認する
gcloud billing projects describe "$PROJECT_ID"

# ラベル付きのバケットを作り、ラベルを書き換える
BUCKET="gs://${PROJECT_ID}-labels"
gcloud storage buckets create "$BUCKET" --location=us-central1 --labels=env=lab,team=study
gcloud storage buckets update "$BUCKET" --update-labels=team=pca
gcloud storage buckets describe "$BUCKET" --format="value(labels)"

最後にバケットを削除します。

gcloud storage buckets delete "$BUCKET"

試験で問われる判断

自作の例です。実際の試験問題ではありません。

  • 「各部門が自分のプロジェクトを管理し、セキュリティチームは全プロジェクトを監査したい」なら、部門ごとのフォルダを作り、セキュリティチームのグループに組織レベルで閲覧系のロールを付けます。プロジェクトごとに付けると漏れが出ます。
  • 「本番環境だけ外部 IP を持つ VM を禁止したい」なら、本番フォルダに組織ポリシーを付けます。本番と開発が同じプロジェクトなら、先に分けます。
  • 「同じプロジェクト内の費用をチームごとに集計したい」なら、ラベルを付けて請求データで集計します。権限を分けないならプロジェクトの分け直しは過剰です。
  • 「経理担当者に請求書を見せたいが、リソースは触らせたくない」なら、請求先アカウントのロールだけを付けます。プロジェクトの閲覧者ロールでは請求書は見られません。

理解度チェック

答えを開く前に、自分で考えてください。結果はこのブラウザにだけ残り、間違えた問題は復習のページでまとめて解き直せます。

思い出す

組織やフォルダに付けた IAM の権限と組織ポリシーは、どこまで効きますか。プロジェクトを別のフォルダへ移すと、効く設定はどう変わりますか。

状況で選ぶ

ある会社は、営業と物流の部門ごとにフォルダを作り、それぞれの下に本番と開発のプロジェクトを置いています。セキュリティ部門は、全社の本番環境でだけ外部 IP を持つ VM を禁止し、これから増える本番プロジェクトにも漏れなく効かせたいと考えています。どうしますか。

説明する

プロジェクトを「アプリごと、環境ごと」に分けるのはなぜですか。同じプロジェクトの中でチームごとの費用を見たいだけなら、どうしますか。