Google Cloud ハンズオン教科書|2026-08 版
第 8 章 試験ガイド 2.2 試験ガイド 1.3

Cloud Storage — オブジェクトストレージ設計

ストレージクラスとライフサイクルで、耐久性とコストを両立する

この章で学ぶこと

試験ガイド対応: セクション 2.2(ストレージ システムの構成)、1.3(ネットワーク、ストレージ、コンピューティング リソースの設計)

バケット・オブジェクト・ロケーション

Cloud Storage は、任意の形式のファイルをオブジェクトとして、バケットという入れ物に保存するマネージドなオブジェクトストレージです。第 4 章の永続ディスク(ブロックストレージ)と違い、ファイルシステムとしてマウントして使うのではなく、HTTP(S) API で読み書きします。1 バケットに保存できるオブジェクト数は実質無制限で、すべてのストレージクラスが年間 99.999999999%(イレブンナイン)の耐久性を目標に設計されています(2026-08 時点の公式ドキュメント記載値)。

ロケーションタイプ — どこに、何重に置くか

バケット作成時に決めるロケーションは、可用性・レイテンシ・料金のすべてに効く、この章で最初の設計判断です。作成後に変更するには専用のバケット再配置(bucket relocation)手続きが必要で気軽には変えられないため、最初に正しく選びます。

リージョン デュアルリージョン マルチリージョン asia-northeast1(東京) asia1(東京+大阪) asia(アジア全域) ゾーン a ゾーン b ゾーン c 同期複製 東京 大阪 リージョン間非同期複製 リージョン リージョン 広域で非同期複製 Standard SLA 99.9% SLA 99.95%/ターボ複製 RPO 15 分 SLA 99.95%/最大の到達範囲
図 8-1 ロケーションタイプごとの冗長化の仕組み。リージョンでも複数ゾーンへ同期複製されるため十分に堅牢だが、リージョン障害には耐えられない。デュアルリージョン(例: asia1 = 東京+大阪)はターボレプリケーションを有効にすると RPO 15 分でリージョン間複製できる(SLA・RPO は 2026-08 時点)。
ロケーションタイプ例冗長化向くケース
リージョンasia-northeast1(東京)ゾーン間で同期複製コンピューティングと同一リージョンに置く分析・処理データ。最安
デュアルリージョンasia1(東京+大阪)2 リージョン間で非同期複製(ターボレプリケーションで RPO 15 分)地理的冗長と書き込み性能を両立したい業務データ・DR
マルチリージョンasia / us / eu広域内の複数リージョンへ非同期複製広域の利用者へ配信するコンテンツ。配信自体は 第 5 章の Cloud CDN と組み合わせる

ストレージクラスと Autoclass

4 つのストレージクラス

ストレージクラスは「保存料金」と「アクセス時のコスト・拘束」のトレードオフです。重要なのは、どのクラスも耐久性は同じイレブンナインで、Archive でもミリ秒で取り出せること。テープのような「取り出しに数時間待つ」制約はなく、違いは純粋に料金構造です。コールドなクラスほど保存単価が下がる代わりに、最小保存期間(早く消すと早期削除料金)と取り出し料金(読むたびに GiB 単価)が課されます。

クラス最小保存期間取り出し料金(2026-08)可用性 SLA(リージョン、2026-08)想定アクセス頻度
Standardなしなし99.9%(マルチ / デュアルは 99.95%)頻繁に読む「ホット」データ
Nearline30 日$0.01 / GiB99.0%(マルチ / デュアルは 99.9%)月 1 回程度(バックアップ)
Coldline90 日$0.02 / GiB99.0%(マルチ / デュアルは 99.9%)四半期に 1 回程度
Archive365 日$0.05 / GiB99.0%(マルチ / デュアルは 99.9%)年 1 回未満(DR・コンプライアンス保存)

保存単価の目安として、東京リージョンの Standard は $0.023 / GiB・月、Nearline は $0.016 / GiB・月です(2026-08 時点)。このほか 2026-08 時点では、AI / ML などの I/O 集約ワークロード向けにゾーンバケット専用の Rapid Storage クラスも提供されていますが、本章では上記 4 クラスと Autoclass に集中します。

Autoclass — アクセスパターンに追随する自動クラス管理

「このデータが将来どれくらい読まれるか」を事前に断言できないなら、Autoclass をバケットで有効化する手があります。オブジェクトごとのアクセス実績に基づいて、クラスを自動で上下させる機能です。

30 日未アクセス 90 日未アクセス 365 日未アクセス Standard 最小期間なし Nearline 最小保存 30 日 Coldline 最小保存 90 日 Archive 最小保存 365 日 読み取りが発生すると Standard へ昇格 終端クラスは既定で Nearline(Archive まで下げる設定も可)
図 8-2 Autoclass の状態遷移。未アクセス日数に応じて右(コールド側)へ移行し、読まれた瞬間に Standard へ戻る。Coldline / Archive への移行は終端クラスを Archive に設定した場合のみ。128 KiB 未満のオブジェクトは移行対象外で Standard に留まる。

Autoclass の要点は 3 つです。第一に、取り出し料金と早期削除料金が課されないため、「Nearline に置いたら想定外に読まれて高くついた」という事故が構造的に起きません。代わりに管理手数料(と有効化時の一時課金)がかかります。第二に、ライフサイクル管理の SetStorageClass / matchesStorageClass ルールとは併用できません。アクセスパターンが読めるならライフサイクル、読めないなら Autoclass、と使い分けます。第三に、既存バケットにも有効化できます(全オブジェクトがいったん Standard 扱いになります)。

試験の視点: ストレージクラスの問題は「アクセス頻度」と「保存期間」の 2 軸で解けます。「月次でしかアクセスしないバックアップ」→ Nearline、「規制で 5 年保存、ほぼ読まない」→ Archive が定石。ひっかけは最小保存期間で、「90 日で削除するデータを Archive に置く」選択肢は早期削除料金で不正解になります。アクセスパターンが不明・変動すると書かれていたら Autoclass を選びます。

データ保護 — バージョニング・ライフサイクル・バケットロック

オブジェクトバージョニング

バージョニングを有効にすると、オブジェクトの置き換えや削除のたびに、直前の状態が非現行(noncurrent)バージョンとして保持されます。各バージョンは世代番号(generation number)で一意に識別され、オブジェクト名#世代番号 の形で取得・復元・完全削除できます。誤削除・誤上書きへの第一の防御線です。

注意すべきはコストで、非現行バージョンにもライブ時と同じ保存料金がかかり続けます。バージョン数に上限はないため、後述のライフサイクルルール(numNewerVersions や daysSinceNoncurrentTime)で古い世代を自動削除する構成が公式の推奨です。なお、バージョニングとは別にソフト削除という保護層もあり、削除されたオブジェクトは既定で 7 日間復元可能です(2026-08 時点)。

ライフサイクル管理 — クラス移行と削除の自動化

ライフサイクル管理は、バケットに JSON で宣言したルールに従って、オブジェクトへ自動でアクションを適用する仕組みです。

設計上おいしいのは、ライフサイクルの SetStorageClass はオブジェクトを書き直さないため、クラス移行に取り出し料金も早期削除料金もリージョン間複製料金もかからないことです。「Standard で 30 日 → Nearline → 1 年後に削除」のような設計を、追加コストなしの自動処理にできます。

保持ポリシーとバケットロック(WORM)

保持ポリシー(--retention-period)をバケットに設定すると、各オブジェクトは指定期間(最長 100 年)が経過するまで削除も置き換えもできなくなり、違反操作は 403 retentionPolicyNotMet で拒否されます。さらにポリシーをロック(--lock-retention-period)すると、ポリシーの削除も期間短縮も永久に不可能になります(延長のみ可)。これが Write-Once-Read-Many(WORM)ストレージで、FINRA・SEC・CFTC のような金融規制や医療系の保存義務に対応する手段として公式に位置づけられています。ロック済みバケットは全オブジェクトが保持期間を満了するまで削除できず、プロジェクト自体にもリーエン(削除保護)がかかります。規制対応の全体像は第 14 章で扱います。

アクセス制御とデータ転送

均一なバケットレベルアクセス

Cloud Storage には歴史的に IAM と ACL(オブジェクト単位のアクセス制御リスト)の 2 系統の権限機構がありますが、現在の推奨は均一なバケットレベルアクセス(uniform bucket-level access)を有効化して ACL を無効にし、IAM に一本化することです。権限の見通しが良くなり、ACL の設定ミスによる意図しない公開を構造的に防げます。有効化して 90 日間が経過すると無効化できなくなる点だけ覚えておいてください。本書のハンズオンでは全バケットで有効化します。

署名付き URL — 時限つきの限定公開

「Google アカウントを持たない相手に、このファイルだけ 10 分間ダウンロードさせたい」。IAM はプリンシパル(アカウント)が前提なので、この要件には署名付き URL を使います。サービスアカウントの権限で URL に署名し、URL を知っていれば誰でも、有効期限内に限り、署名された操作(GET / PUT など)だけを実行できます。有効期限は最長 604,800 秒 = 7 日間です(V4 署名。鍵ファイルを使わず署名する場合は最長 12 時間)。典型用途はエンドユーザーからの直接アップロード / ダウンロードで、アプリサーバーがファイル本体を中継しなくて済みます。

エンドユーザー Google アカウント不要 アプリサーバー SA の権限で署名 Cloud Storage 非公開バケット ① 署名を依頼 ② 署名付き URL ③ 有効期限内は URL で直接 GET / PUT
図 8-3 署名付き URL の流れ。ファイル本体はアプリサーバーを経由せず、ユーザーと Cloud Storage の間を直接流れる(③)。署名にはサービスアカウントの権限を使うため、第 2 章の impersonation がそのまま活きる。

データ転送の 3 つの選択肢

既存データを Cloud Storage へ運ぶ手段は、データ量と回線帯域で選びます。公式ドキュメントの目安は「オンプレミスから 1 TB 未満なら gcloud storage、1 TB 以上なら Storage Transfer Service か Transfer Appliance」です。

移行データ量は? 1 TB 未満 1 TB 以上 gcloud storage オンラインで直接コピー 回線帯域は十分? 十分 不十分・接続なし Storage Transfer Service マネージド転送・定期同期 Transfer Appliance 物理搬送
図 8-4 転送手段のデシジョンツリー(公式の目安に基づく)。所要時間の概算は「データ量 ÷ 実効帯域」。オンライン転送に何週間もかかる規模・回線なら、アプライアンスにコピーして物理的に送る方が速い。
試験の視点: 転送問題は必ず「データ量 ÷ 帯域」を暗算します。たとえば 500 TB を 100 Mbps 回線で送ると 4 × 1015 ビット ÷ 108 bps ≒ 4 × 107 秒 ≒ 460 日超。この規模は Transfer Appliance 一択です。逆に「S3 から定期的に同期」のようにソースがクラウドで回線が太い場合は Storage Transfer Service を選びます。移行計画の全体像は第 17 章で再登場します。
ハンズオン 8-1|バケットを作成して gcloud storage の基本操作を身につける

東京リージョンにバケットを作り、アップロード・一覧・ダウンロードを一通り実行します。所要 10 分。費用の目安: 実質 0 円(東京の Standard は $0.023 / GiB・月(2026-08 時点)。数十バイトを数十分置くだけなので 1 円未満です)。Cloud Shell での実行を前提とします(ローカルの gcloud でも同じです)。

  1. プロジェクト ID を確認し、バケットを作成する。バケット名は全世界で一意のため PROJECT_ID を接頭辞にする(以降のコマンドの PROJECT_ID は自分の値に読み替え):
gcloud config get-value project   # ここで表示された値が PROJECT_ID

gcloud storage buckets create gs://PROJECT_ID-ch08-basic \
    --location=asia-northeast1 \
    --default-storage-class=STANDARD \
    --uniform-bucket-level-access
  1. ファイルをアップロードし、一覧表示とダウンロードで往復を確認する:
echo "Hello, Cloud Storage!" > hello.txt
gcloud storage cp hello.txt gs://PROJECT_ID-ch08-basic/
gcloud storage ls --long gs://PROJECT_ID-ch08-basic/
gcloud storage cp gs://PROJECT_ID-ch08-basic/hello.txt ./hello-dl.txt
cat hello-dl.txt

期待される出力: ls --long にサイズ・更新時刻つきで gs://PROJECT_ID-ch08-basic/hello.txt が 1 行表示され、最後の cat が Hello, Cloud Storage! を返せば成功です。

後片付け:(バケットと中身をまとめて削除)

gcloud storage rm --recursive gs://PROJECT_ID-ch08-basic
rm hello.txt hello-dl.txt
ハンズオン 8-2|ライフサイクルルールとバージョニングを設定する

バージョニングを有効化したバケットに「30 日で Nearline へ移行」「非現行バージョンは新しい 3 世代を残して削除」の 2 ルールを宣言し、上書きで世代が積まれる様子を観察します。所要 15 分。費用の目安: 実質 0 円(数十バイトのみ。ルールの発動自体は 30 日後なので、最後に削除すれば課金はほぼ発生しません)。

  1. バケットを作成し、バージョニングを有効化する:
gcloud storage buckets create gs://PROJECT_ID-ch08-lifecycle \
    --location=asia-northeast1 \
    --uniform-bucket-level-access
gcloud storage buckets update gs://PROJECT_ID-ch08-lifecycle --versioning
  1. ライフサイクル設定を JSON で書く。ルール内の条件は AND、ルール間は OR で評価される:
cat > lifecycle.json << 'EOF'
{
  "rule": [
    {
      "action": {"type": "SetStorageClass", "storageClass": "NEARLINE"},
      "condition": {"age": 30, "matchesStorageClass": ["STANDARD"]}
    },
    {
      "action": {"type": "Delete"},
      "condition": {"isLive": false, "numNewerVersions": 3}
    }
  ]
}
EOF
  1. バケットに適用し、設定内容を確認する:
gcloud storage buckets update gs://PROJECT_ID-ch08-lifecycle \
    --lifecycle-file=lifecycle.json
gcloud storage buckets describe gs://PROJECT_ID-ch08-lifecycle \
    --format="default(lifecycle_config)"
  1. 同名オブジェクトを 2 回アップロードし、全バージョンを表示する:
echo "v1" > note.txt
gcloud storage cp note.txt gs://PROJECT_ID-ch08-lifecycle/
echo "v2" > note.txt
gcloud storage cp note.txt gs://PROJECT_ID-ch08-lifecycle/
gcloud storage ls --all-versions gs://PROJECT_ID-ch08-lifecycle/

期待される出力: note.txt#世代番号 が 2 行表示されます。小さい方の世代番号が v1(非現行)です。gcloud storage cp "gs://.../note.txt#世代番号" ./old.txt のように世代番号つきで指定すれば、過去バージョンを取り出せます。

後片付け:(--recursive は非現行バージョンも含めて削除します)

gcloud storage rm --recursive gs://PROJECT_ID-ch08-lifecycle
rm lifecycle.json note.txt
ハンズオン 8-3|署名付き URL でオブジェクトを一時公開する

非公開バケットのオブジェクトに、10 分間だけ有効なダウンロード URL を発行します。署名にはサービスアカウントの impersonation(第 2 章)を使い、鍵ファイルは作りません。所要 15 分。費用の目安: 実質 0 円(数十バイトの保存と数回のリクエストのみ)。

  1. バケット・オブジェクト・署名用サービスアカウントを用意し、権限を付与する。YOUR_EMAIL は gcloud config get-value account で表示される自分のアカウント:
# バケットとオブジェクト
gcloud storage buckets create gs://PROJECT_ID-ch08-signed \
    --location=asia-northeast1 --uniform-bucket-level-access
echo "limited-time report" > report.txt
gcloud storage cp report.txt gs://PROJECT_ID-ch08-signed/

# 署名用サービスアカウント(オブジェクト閲覧権限のみ)
gcloud iam service-accounts create ch08-signer
gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID-ch08-signed \
    --member=serviceAccount:ch08-signer@PROJECT_ID.iam.gserviceaccount.com \
    --role=roles/storage.objectViewer

# 自分に SA の借用(impersonation)を許可
gcloud iam service-accounts add-iam-policy-binding \
    ch08-signer@PROJECT_ID.iam.gserviceaccount.com \
    --member=user:YOUR_EMAIL \
    --role=roles/iam.serviceAccountTokenCreator
  1. 署名付き URL を発行する(IAM の反映に 1〜2 分かかることがあります。エラーになったら少し待って再実行):
gcloud storage sign-url gs://PROJECT_ID-ch08-signed/report.txt \
    --duration=10m \
    --impersonate-service-account=ch08-signer@PROJECT_ID.iam.gserviceaccount.com

期待される出力: signed_url: に始まる長い URL が表示されます(X-Goog-Signature などのクエリパラメータを含みます)。鍵ファイルなしの署名なので --duration の上限は 12 時間、鍵ファイルを使う場合の上限は 7 日です。

  1. 認証情報なしでアクセスできることを確認する(URL は必ず引用符で囲む):
curl "signed_url の値をここに貼る"
# → limited-time report

10 分経過後に同じ URL へアクセスすると、期限切れエラー(ExpiredToken)で拒否されます。

後片付け:

gcloud storage rm --recursive gs://PROJECT_ID-ch08-signed
gcloud iam service-accounts delete \
    ch08-signer@PROJECT_ID.iam.gserviceaccount.com --quiet
rm report.txt

つまずきポイント

早期削除料金は「削除」以外でも発生する。 Nearline / Coldline / Archive の最小保存期間(30 / 90 / 365 日)内にオブジェクトを消すと残期間分が課金されますが、これは上書きや手動のクラス変更(rewrite)でも発生します。一方、ライフサイクル管理によるクラス変更と Autoclass 有効バケットでは発生しません。「コールドクラスへ早く落としすぎて、変更のたびに課金される」が典型的な事故です。
ライフサイクルルールは即時発動しない。 設定変更の反映には最大 24 時間かかり、条件成立後のアクション実行も非同期(遅延あり)です。「age: 1 の削除ルールを入れたのに翌朝まだ残っている」は正常動作で、アクション実行までの間の保存料金も発生し続けます。分単位の削除が必要なら、アプリケーション側で明示的に削除してください。
バケットロックは絶対に戻せない。 ロック済み保持ポリシーは削除も期間短縮もできず、全オブジェクトが期間満了するまでバケットも消せません。プロジェクトにはリーエンがかかり、プロジェクトごと消して逃げることもできません。誤って 100 年でロックすれば 100 年残ります。検証は必ず捨てバケット + 未ロックのポリシー(--clear-retention-period で解除可能)で行い、ロックは本番の規制要件が確定してから実行してください。
バージョニングの放置は静かに課金を積む。 非現行バージョンはライブと同額で課金され、上限もありません。ログのように高頻度で上書きされるオブジェクトでは、気づけば保存量が数十倍になっていることがあります。バージョニングを有効にするときは、numNewerVersions か daysSinceNoncurrentTime による削除ルールを必ずセットで入れてください。

理解度チェック

Q1. 4 つのストレージクラスで異なるのは何か、共通なのは何か?

異なるのは料金構造 — 保存単価、最小保存期間(なし / 30 / 90 / 365 日)、取り出し料金(なし / $0.01 / $0.02 / $0.05 per GiB、2026-08 時点)と可用性 SLA です。共通なのは耐久性(イレブンナイン設計)とアクセス速度で、Archive でもミリ秒で取り出せます。

Q2. ライフサイクル管理で Standard から Nearline へ移行させた場合と、手動で rewrite した場合のコストの違いは?

ライフサイクルの SetStorageClass はオブジェクトを書き直さないため、取り出し料金・早期削除料金・リージョン間複製料金が一切かかりません。手動の rewrite は置き換え扱いになるため、最小保存期間内なら早期削除料金が発生します。自動化はコスト面でも有利です。

Q3. Autoclass とライフサイクル管理はどう使い分けるか?

アクセスパターンが予測できるならライフサイクル管理(無料で、日数条件で決定的に動く)、予測できない・変動するなら Autoclass(管理手数料はかかるが、取り出し料金と早期削除料金が発生せず、読まれたら Standard へ自動昇格)です。なお Autoclass は SetStorageClass / matchesStorageClass を使うライフサイクルルールと併用できません。

Q4.(試験形式)金融機関が取引記録を規制対応のため 7 年間、確実に改ざん・削除できない形で保存する必要がある。最も適切な構成は?
A. バージョニングを有効化した Coldline バケット B. 保持ポリシー 7 年を設定しロックした Archive バケット C. IAM で全員から削除権限を外したバケット D. 7 年後に削除するライフサイクルルールを設定したバケット

B。ロック済み保持ポリシーだけが、管理者を含む誰にも削除・上書き・期間短縮を許さない WORM 保証を提供します(FINRA / SEC / CFTC 対応として公式に位置づけ)。A はバージョンの完全削除が可能、C は IAM を再付与すれば削除できてしまい「確実に不可」の要件を満たしません。D は削除の自動化であって保護ではありません。アクセス頻度が極めて低い 7 年保存なので、クラスは Archive が最もコスト効率に優れます。

Q5.(試験形式)オンプレミスのデータセンターにある 500 TB のアーカイブデータを Cloud Storage へ移行したい。拠点の回線は 100 Mbps で、業務トラフィックと共用している。最も適切な移行手段は?
A. gcloud storage cp で並列アップロード B. Storage Transfer Service のエージェント転送 C. Transfer Appliance D. デュアルリージョンバケットへの直接書き込み

C。500 TB ≒ 4 × 1015 ビットを 100 Mbps で送ると理論値でも 460 日以上かかり、実効帯域は共用でさらに細いため、オンライン転送(A・B)は現実的ではありません。回線がボトルネックの大容量移行は物理搬送の Transfer Appliance が定石です。D はロケーションタイプの話であり、転送手段の解決になっていません。

まとめと次章へ

参考リンク(一次情報):

オブジェクトストレージは「何でも置ける」万能選手ですが、トランザクションやクエリが必要な構造化データには不向きです。次の第 9 章では、リレーショナルデータベース 3 兄弟 — Cloud SQL・AlloyDB・Spanner — の使い分けを設計します。