セクション2:アプリケーションの構築とテスト
公式試験ガイド 042426版 — Section 2: Building and testing applications
2.1 開発環境のセットアップ
3つの「開発する場所」と特徴比較
Cloud Workstations 深掘り(2026改訂で重要)
2026年改訂で 新規追加された頻出トピック。「企業の標準開発環境を強制する」シナリオで定番解答。
3層構造
3層リソースの役割
| レイヤー | 定義する内容 | 誰が管理 |
|---|---|---|
| Cluster | VPC ネットワーク、リージョン、Private Service Connect 設定 | セキュリティ / プラットフォーム管理者 |
| Configuration | OS イメージ(Code OSS / VSCode / IntelliJ ベース)、マシンタイプ、永続ボリュームサイズ、idle/running timeout、起動スクリプト | プラットフォーム管理者 / リード |
| Workstation | 個別の開発者インスタンス。Configuration から作成され、個別の永続ホームを持つ | 開発者本人 |
サポートされる IDE
- Base Editor(ブラウザ版 Code OSS): ブラウザだけで使える VSCode 互換
- VSCode(ローカル): Remote SSH で接続、ローカル UI で操作
- JetBrains IDE(ブラウザ JetBrains Gateway): IntelliJ Ultimate / PyCharm Professional / GoLand
- SSH: 任意の IDE / Vim / Emacs から接続可
- 環境統一: 「俺の環境で動く」問題が解消(OS / バージョン / 拡張)
- セキュリティ: VPC 内でのみ動作、ソース持出禁止、IAM 制御
- オンボーディング: 新人が初日からフル環境で作業開始
- Gemini Code Assist 統合: AI コード補完が標準で利用可能
- スケール: 大規模リポジトリのインデックス・ビルドをローカル PC より高速
| Cloud Shell | Cloud Workstations | |
|---|---|---|
| 用途 | 軽い検証・出先・スキマ時間 | 本格的な日常開発 |
| コスト | 無料 | VM 起動時間で課金 |
| 制限 | 週50h、20分idleで切断 | idle/running timeout は管理者が設定 |
| カスタマイズ | 限定的 | Configuration で完全カスタム |
| 企業ポリシー強制 | 限定的 | VPC SC・IAM で強制 |
🆕 Gemini Cloud Assist 深掘り(2026改訂)
2026改訂で明示的にシラバスに加わった AI アシスタント。GCP コンソール、Cloud Code、Cloud Workstations の各所で動作。
🧠 コード生成・修正
「Pub/Sub に publish する Python 関数を書いて」「このコードをリファクタして」 → 即生成・適用
📖 コード理解
選択コードを「説明して」「テスト書いて」「コメント追加して」
🔎 可観測性アシスト
自然言語から Cloud Logging クエリ生成、Cloud Trace の要約、Error Reporting の根本原因推定
⚙️ gcloud / kubectl コマンド提案
「Cloud Run を us-central1 にデプロイ、min-instances=1 で」 → コマンド生成
- AI 生成コードを盲信しない: ハルシネーション(存在しない API / 引数)の可能性
- セキュリティレビュー必須: SQL インジェクション、XSS、シークレットの平文埋め込みなど
- ライセンス・コンプライアンス: 生成コードの著作権・特許リスクを社内ポリシーに従って確認
- テスト生成は雛形: AI が生成したテストは「エッジケース」をカバーしていないことが多い。人間が追加
🆕 MCP(Model Context Protocol)サーバー(2026改訂)
2026改訂で初出。AI モデルが外部リソース(GitHub、DB、社内API)に接続する標準プロトコル。試験で名前を覚えていれば即答可能なトピック。
MCP の概念
- 標準化: 各 AI ツール(Claude Desktop / Cursor / Cline 等)が同じプロトコルで外部を扱える
- ツール定義: 「GitHub の PR を取得」「BigQuery にクエリ」などを関数(tool)として定義
- リソース定義: ファイル / DB レコードをリソース URIで表現
- プロンプト: 共通のプロンプトテンプレートを配布可能
gcloud エミュレータでローカル開発
本番 GCP に課金されずに、ローカルでテスト・開発するためのツール群。
| サービス | 起動コマンド | 環境変数(クライアントが見る) |
|---|---|---|
| Pub/Sub | gcloud beta emulators pubsub start --host-port=localhost:8085 | PUBSUB_EMULATOR_HOST |
| Firestore | gcloud emulators firestore start --host-port=localhost:8080 | FIRESTORE_EMULATOR_HOST |
| Bigtable | gcloud beta emulators bigtable start --host-port=localhost:8086 | BIGTABLE_EMULATOR_HOST |
| Datastore | gcloud beta emulators datastore start | DATASTORE_EMULATOR_HOST |
| Spanner | gcloud emulators spanner start | SPANNER_EMULATOR_HOST |
# テストコード(Pub/Sub エミュレータ利用)
import os
os.environ["PUBSUB_EMULATOR_HOST"] = "localhost:8085"
from google.cloud import pubsub_v1
publisher = pubsub_v1.PublisherClient() # 自動的にエミュレータに接続
topic_path = publisher.topic_path("test-project", "test-topic")
publisher.create_topic(request={"name": topic_path})
publisher.publish(topic_path, b"hello")
- 本番との機能差異がある(例: Pub/Sub エミュレータは Ordering Keys / Exactly-once 未対応)
- パフォーマンス・スケール挙動は本物と異なる
- IAM / quota / billing はエミュレートされない
- 本番想定の統合テストは別途(Cloud Build 上で本物の Pub/Sub を使うテストプロジェクト等)必要
2.2 ビルド
Cloud Build YAML の構造
# cloudbuild.yaml の完全構造例
steps:
# 各ステップは Docker コンテナで実行
- id: 'lint'
name: 'python:3.11' # 実行するコンテナイメージ
waitFor: ['-'] # 並列実行(依存なし)
entrypoint: 'bash'
args: ['-c', 'pip install ruff && ruff check src/']
- id: 'unit-test'
name: 'python:3.11'
waitFor: ['-'] # lint と並列
entrypoint: 'bash'
args: ['-c', 'pip install -r requirements.txt pytest && pytest tests/']
env:
- 'CI=true'
- id: 'build'
name: 'gcr.io/cloud-builders/docker'
waitFor: ['lint', 'unit-test'] # 両方を待つ
args: ['build',
'-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:$SHORT_SHA',
'-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:latest',
'.']
- id: 'vuln-scan'
name: 'gcr.io/cloud-builders/gcloud'
waitFor: ['build']
entrypoint: 'bash'
args:
- '-c'
- |
gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:$SHORT_SHA \
--format=json | tee /workspace/scan.json
# HIGH/CRITICAL があれば失敗
! grep -E '"severity":\s*"(HIGH|CRITICAL)"' /workspace/scan.json
- id: 'push'
name: 'gcr.io/cloud-builders/docker'
waitFor: ['vuln-scan']
args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:$SHORT_SHA']
- id: 'deploy'
name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'gcloud'
args: ['run', 'deploy', 'my-app',
'--image', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:$SHORT_SHA',
'--region', 'us-central1',
'--no-traffic',
'--tag', 'canary']
# images で push 対象を宣言(自動 push + provenance 生成)
images:
- 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/app:$SHORT_SHA'
# シークレットの宣言
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/SLACK_WEBHOOK/versions/latest
env: 'SLACK_WEBHOOK'
# ビルドオプション
options:
machineType: 'E2_HIGHCPU_8' # 高速ビルド用マシン
logging: CLOUD_LOGGING_ONLY
substitution_option: ALLOW_LOOSE
# Substitutions(自動定義 + カスタム)
substitutions:
_REGION: 'us-central1'
_ENVIRONMENT: 'staging'
# タイムアウト(デフォルト 10分、最大 24時間)
timeout: '1200s'
自動定義される Substitutions
| 変数 | 意味 |
|---|---|
$PROJECT_ID | プロジェクト ID |
$PROJECT_NUMBER | プロジェクト番号(数字) |
$BUILD_ID | ビルドの UUID |
$SHORT_SHA | コミット SHA の最初の 7文字 |
$REVISION_ID | 完全なコミット SHA |
$BRANCH_NAME | ブランチ名 |
$TAG_NAME | タグ名 |
$REPO_NAME | リポジトリ名 |
$_カスタム名 | ユーザー定義(必ず _ で始まる) |
ビルド時間短縮の5つの戦略(公式推奨)
① マシンタイプを強化
options:
machineType: 'E2_HIGHCPU_8' # 8 vCPU 8GB(デフォルト e2-medium の 4倍)
# 選択肢: E2_HIGHCPU_8 / E2_HIGHCPU_32 / N1_HIGHCPU_8 / N1_HIGHCPU_32
- デフォルトは
e2-medium(1 vCPU、4GB)— 並列ビルドに不向き - マシンタイプを
E2_HIGHCPU_8以上にすると Docker レイヤビルドが大幅高速化 - 料金は時間単位で課金されるが、マシン強化で短時間化 = 結果的に安くなることも多い
② Docker レイヤキャッシュ(--cache-from)
steps:
# 既存イメージを pull(キャッシュ用)
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args: ['-c', 'docker pull IMAGE:latest || exit 0']
# cache-from を使ってビルド
- name: 'gcr.io/cloud-builders/docker'
args: ['build',
'--cache-from', 'IMAGE:latest',
'-t', 'IMAGE:$SHORT_SHA',
'-t', 'IMAGE:latest',
'.']
③ GCS キャッシュ(Docker 以外も対応)
steps:
# キャッシュ復元
- name: 'gcr.io/cloud-builders/gsutil'
args: ['-m', 'cp', '-r', 'gs://cache-bucket/pip-cache', '/workspace/.cache']
waitFor: ['-']
# ビルド(キャッシュを使う)
- name: 'python:3.11'
entrypoint: 'bash'
args: ['-c', 'pip install --cache-dir=/workspace/.cache/pip -r requirements.txt']
# キャッシュ保存
- name: 'gcr.io/cloud-builders/gsutil'
args: ['-m', 'cp', '-r', '/workspace/.cache', 'gs://cache-bucket/']
Python の pip、Node.js の npm、Maven の ~/.m2 など、すべて GCS にキャッシュ可。
④ 並列ステップ(waitFor: ['-'])
waitFor: ['-'] は「依存なし、即座に並列開始」を意味する。
⑤ .gcloudignore でアップロードサイズ削減
# .gcloudignore(gitignore と同様の構文)
.git
.github
*.md
docs/
node_modules/
__pycache__/
*.pyc
dist/
build/
vendor/
.env*
Cloud Build はソースを ZIP して GCS にアップロード → ビルダーに転送する。アップロード対象を絞ると転送時間とコストの両方が短縮される。
Cloud Build でのシークレット利用
# cloudbuild.yaml
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/SLACK_WEBHOOK/versions/latest
env: 'SLACK_WEBHOOK' # この名前で参照される環境変数
steps:
- name: 'gcr.io/cloud-builders/curl'
entrypoint: 'bash'
secretEnv: ['SLACK_WEBHOOK'] # step ごとに参照を宣言
args:
- '-c'
- |
curl -X POST -H 'Content-Type: application/json' \
-d "{\"text\":\"Build succeeded: $SHORT_SHA\"}" \
"$$SLACK_WEBHOOK" # $$ で参照($ は substitution と衝突)
$VARと$$VARの混同: substitution は$VAR、シークレットは$$VAR- args フィールドでのみ参照可: env フィールドや name フィールドでは直接使えない
- 非 UTF-8 バイナリは直接利用不可: ファイルに保存してから読む(base64 デコード)
- Cloud Build サービスアカウントに権限が必要:
roles/secretmanager.secretAccessorを Cloud Build SA に付与 - レガシー Cloud Build SA への付与は危険: そのプロジェクトのトリガーを使える全ユーザーがアクセス可能になる。専用 SA + 細粒度 IAM を推奨
Artifact Registry 深掘り
Container Registry (gcr.io) の後継。新規プロジェクトでは必須選択。
サポートする形式(フォーマット)
Docker
OCI 互換のコンテナイメージ。最も使われる。
Maven
Java の Maven リポジトリ。社内 jar の共有。
npm
Node.js パッケージ。
Python
PyPI 互換、社内 wheel/tarball 共有。
apt / yum / RPM
OS パッケージリポジトリ。
Go modules
Go の go.mod 用プロキシ。
Helm
Kubernetes Helm チャート。
Generic(汎用)
任意のバイナリアーティファクト。
Container Registry との違い
| 項目 | Container Registry (gcr.io) | Artifact Registry |
|---|---|---|
| 形式 | Docker のみ | Docker / Maven / npm / Python / apt / Go / Helm / Generic |
| 権限 | GCS バケットレベル | リポジトリレベル(IAM 細粒度) |
| リージョン | マルチリージョン強制 | リージョン選択可 |
| CMEK | 非対応 | 対応 |
| VPC SC | 限定 | 完全対応 |
| 脆弱性スキャン | 対応 | 対応(Artifact Analysis) |
| 状態 | 非推奨(deprecated) | 推奨 |
リポジトリ作成
# Docker リポジトリの作成
gcloud artifacts repositories create my-app \
--repository-format=docker \
--location=us-central1 \
--description="Production app images" \
--kms-key=projects/$PROJECT_ID/locations/us-central1/keyRings/binauthz/cryptoKeys/registry-cmek
# Docker 認証設定
gcloud auth configure-docker us-central1-docker.pkg.dev
# Push
docker push us-central1-docker.pkg.dev/$PROJECT_ID/my-app/image:v1
- デプロイ先と同じリージョンにリポジトリを置く(pull の latency 削減)
- マルチリージョン展開なら 各リージョンにリポジトリを作成し、Cloud Build で全リージョンに push
- 環境別(dev/staging/prod)に別リポジトリを作り、IAM で権限分離
Buildpacks による Dockerfile 不要のビルド
Cloud Native Buildpacks をベースにした、ソースコードからコンテナを自動生成する仕組み。
# ソースから直接 Cloud Run へ
gcloud run deploy my-service --source . --region us-central1
# 内部で起きること:
# 1. ソースを ZIP して GCS にアップ
# 2. Cloud Build が起動
# 3. Buildpacks が言語を自動検出(requirements.txt → Python、package.json → Node.js)
# 4. セキュリティパッチ済みベースイメージを選択
# 5. アプリ依存をインストール、最小イメージ生成
# 6. Artifact Registry に push
# 7. Cloud Run にデプロイ
# 8. HTTPS URL を返却
サポートされる言語
- Python(requirements.txt / Pipfile / pyproject.toml)
- Node.js(package.json)
- Go(go.mod)
- Java / Kotlin(pom.xml / build.gradle)
- Ruby(Gemfile)
- .NET(*.csproj)
- PHP(composer.json)
✅ Buildpacks のメリット
- Dockerfile を書かなくて済む
- ベースイメージのセキュリティパッチを自動適用
- イメージサイズが最適化される
- SBOM(Software Bill of Materials)を自動生成
⚠️ Buildpacks の制約
- カスタマイズが Dockerfile より制限
- OS パッケージ追加には
project.toml等の工夫が必要 - 特殊な C 拡張のビルドは Dockerfile の方が確実
2.3 テスト
テストピラミッド(Cloud Build 上の実装)
ユニットテスト
- 純関数 / クラス単体のテスト
- 外部依存はモックまたはエミュレータ
- Cloud Build の早い段階で実行(fail-fast)
統合テスト
- 複数モジュール / サブシステムを連結
- Cloud Build 内で
docker-composeまたはdocker runで DB を立てる - 本物の Pub/Sub テストプロジェクトを使うパターンも
E2E テスト
- 本物の staging 環境を相手に HTTP で叩く
- 少数の重要シナリオのみ(ログイン → 注文 → 決済)
- Cloud Build の後段、デプロイ後に実行
AI コーディングアシスタントを使ったテスト生成
# ユニットテストの雛形を AI に生成させ、人間がエッジケースを補完するパターン
# AI に「order_service.py のテストを書いて」と指示すると…
def test_create_order_success():
order = create_order(user_id="u1", items=[("p1", 2)])
assert order.status == "PENDING"
assert order.total == 200
def test_create_order_empty_items_raises():
with pytest.raises(ValueError):
create_order(user_id="u1", items=[])
# 人間がエッジケースを追加(AI が見落としがち)
def test_create_order_negative_quantity_raises():
with pytest.raises(ValueError):
create_order(user_id="u1", items=[("p1", -1)])
def test_create_order_inventory_exhausted():
# 在庫切れシナリオは AI が見落としがち
with pytest.raises(InventoryError):
create_order(user_id="u1", items=[("out_of_stock_item", 1)])
サプライチェーンセキュリティ(SLSA)
Section 2 の仕上げトピック。Cloud Build → Artifact Registry → Binary Authorization の流れを完全に理解する。
SLSA レベルとは
SLSA = Supply chain Levels for Software Artifacts。サプライチェーンセキュリティの成熟度を 4段階で表現。
Provenance(プロビナンス)とは
「このイメージは誰が・どのソースから・どのビルダーで作ったか」のメタデータ証跡。改ざん検出と監査に使う。
{
"_type": "https://in-toto.io/Statement/v1",
"subject": [{
"name": "us-central1-docker.pkg.dev/my-project/my-repo/app",
"digest": {"sha256": "abc123..."}
}],
"predicateType": "https://slsa.dev/provenance/v1",
"predicate": {
"buildDefinition": {
"buildType": "https://cloudbuild.googleapis.com/...",
"externalParameters": {
"sourceRepository": "https://github.com/my-org/my-repo",
"sourceRevision": "abc1234567890"
},
"internalParameters": { "projectId": "my-project" },
"resolvedDependencies": [...]
},
"runDetails": {
"builder": { "id": "https://cloudbuild.googleapis.com/GoogleHostedWorker@v0.3" },
"metadata": {
"invocationId": "projects/.../builds/...",
"startedOn": "2026-05-28T12:00:00Z",
"finishedOn": "2026-05-28T12:03:42Z"
}
}
}
}
Binary Authorization で provenance を検証
provenance を attestor の署名と組み合わせれば、デプロイ時に「本当に Cloud Build で・本当にこのリポジトリのこのコミットから作られたか」を検証できる。
Artifact Analysis(脆弱性スキャン)
# 手動スキャン
gcloud artifacts docker images scan IMAGE_URL
# Cloud Build 内で実行 + HIGH/CRITICAL があれば失敗
gcloud artifacts docker images scan IMAGE_URL --format=json | \
python -c "
import json, sys
data = json.load(sys.stdin)
high_critical = [v for v in data['response']['scan']['discoveryOccurrence']['vulnerability']
if v['severity'] in ('HIGH', 'CRITICAL')]
if high_critical:
print(f'Found {len(high_critical)} HIGH/CRITICAL vulnerabilities')
sys.exit(1)
"
- Cloud Build: SLSA L3 provenance 自動生成
- Artifact Analysis: 脆弱性スキャン → HIGH/CRITICAL でビルド失敗
- Cloud KMS: attestor 用の署名鍵を CMEK で管理
- attestation 作成: ビルド成功時に Cloud Build で attestor 署名
- Binary Authorization: デプロイ時に attestation を検証
- Security Command Center: 全体の脅威を統合可視化
- 「:latest タグでデプロイ」 → ロールバック不能、provenance 追跡困難
- 「ローカル Docker で push」 → provenance 不在、信頼できない
- 「Container Registry を使い続ける」 → 非推奨、機能制限
- 「Binary Auth を ALWAYS_ALLOW で運用」 → 効果ゼロ。最低でも DRYRUN_AUDIT_LOG_ONLY で監査
- 「SA Key で Cloud Build を呼ぶ」 → SA Key 漏洩でサプライチェーン全体が崩壊
🚨 事故ケース集(postmortem 形式)
Cloud Build で echo $SECRET したらビルドログに平文露出 → ログ閲覧権限者全員が知り得る状態に
セキュリティ監査でビルドログを抽出 → DB パスワード、サードパーティ API キーが平文で記録されていた。過去6ヶ月分のログに残存。
- デバッグ時に追加した
echo "Connecting with $DB_PASSWORD"がそのまま残った - Cloud Build は
secretEnvで渡したシークレット値はマスクするが、echoで stdout に出力するとログに残る - ビルドログ閲覧権限(
roles/cloudbuild.builds.viewer)を持つ多数の開発者がアクセス可能
過去6ヶ月でログを閲覧した可能性のある社内 12名 + 外部委託 4名がシークレットを知り得た状態。全シークレットをローテーション + Cloud Audit Logs で閲覧履歴調査。
- 全シークレット即時ローテーション(DB パスワード、API キー、Webhook URL)
- 該当ビルドログを Log Bucket レベルで削除(retention policy 確認)
- Cloud Audit Logs で過去のログ閲覧履歴を調査
- Slack / Email で関係者に開示状況を共有
- シークレットを絶対に echo / print しない。ステップ内で参照したら直接アプリに渡す
- Lint ルールで
echo \$SECRETパターン検知 - Cloud Build の
logging: CLOUD_LOGGING_ONLYで GCS への二重保存を防ぐ - ビルドログ閲覧権限は最小化、ローテーション
- 機密データに対する DLP スキャナをログに適用
:latest タグでデプロイ運用 → 障害時にロールバック不能、原因追跡も困難
本番で 500 エラーが多発し始めたため、「前の安定版に戻したい」と判断。しかし Cloud Run が見ている my-app:latest が「現在の壊れた版」を指しているため、「前のバージョン」を特定できない。デプロイ履歴も :latest なので、どのコミットの版か分からない。
- Cloud Build で
docker tag my-app:latestのみ作成、SHA タグなし - Cloud Run のデプロイで
--image=my-app:latest指定 - 結果、Cloud Run リビジョンの履歴を見ても全部
my-app:latestで、どの SHA かわからない - Artifact Registry でも
:latestは常に最新を指す可動タグ。過去版は別タグがないと特定困難
ロールバック判断から実施までに 40分(本来 1分)。SLA 違反 + 顧客苦情多数。
- Artifact Registry のイメージ履歴から、SHA digest と push 時刻で「前の版」を特定
- SHA digest 指定で Cloud Run にロールバック:
gcloud run deploy --image=my-app@sha256:abc... - 運用ルールを変更し、全ビルドで
$SHORT_SHAタグを必須化
:latestタグでデプロイしない。必ず$SHORT_SHAやセマンティックバージョン- Cloud Run のロールバックは「リビジョン管理」で行う:
gcloud run services update-traffic --to-revisions=PREVIOUS=100 - Artifact Registry の retention policy で過去版を一定期間保持
- Cloud Build でイメージにビルド時のメタデータ(コミット SHA、ブランチ、ビルド ID)をラベル付与
Binary Auth を本番でいきなり ENFORCED にしたら、未署名の既存イメージが軒並みデプロイ拒否
Binary Authorization のポリシーを REQUIRE_ATTESTATION + ENFORCED_BLOCK_AND_AUDIT_LOG に変更したら、それ以降すべてのデプロイが拒否。緊急のホットフィックスもデプロイできなくなる。
- これまでの本番イメージには attestation 署名が一切なかった
- 新ポリシーで「署名必須」にしたため、既存・新規問わず全イメージが拒否
- 導入前のテスト(DRYRUN モード)を経ずに本番に適用
- Cloud Build から attestation を作成する CI パイプラインも整備されていなかった
デプロイ完全停止 2時間。緊急のセキュリティパッチ適用もできない状態に。CI/CD 系の整備に丸2日を追加で要した。
- 緊急で Binary Auth のポリシーを
ALWAYS_ALLOWに戻し、デプロイを復活 - Cloud Build の YAML に
gcloud container binauthz attestations sign-and-createステップを追加 - テスト環境で
DRYRUN_AUDIT_LOG_ONLYで検証 → すべて成功するまで待つ - 本番に再展開(DRYRUN → ENFORCED は段階的に)
- Binary Authorization 導入は必ず DRYRUN モードから:
enforcementMode: DRYRUN_AUDIT_LOG_ONLY - DRYRUN で監査ログを 1〜2 週間観察 → 違反ゼロを確認してから ENFORCED に
- Cloud Build パイプラインに attestation 自動作成を組み込んでから有効化
- break-glass 用の手順を事前に文書化(緊急時の bypass 方法)
Container Registry (gcr.io) を使い続けていたら EOL アナウンスでデプロイパイプライン全停止
Container Registry の機能制限(pull/push の一部 API が deprecated)が発生し、Cloud Build パイプラインが軒並み失敗。Cloud Run も pull が遅延。
- Google が公式に「Container Registry を非推奨化、Artifact Registry に移行を推奨」と発表していたが、リソースを割けず先延ばし
- Container Registry は内部的に GCS バケットを使う構造のため、機能拡張が制限
- 機能制限のタイミングで運用パイプラインが影響を受ける
緊急移行作業 1週間。CI/CD パイプライン、運用スクリプト、ドキュメントを全置換。Helm chart や Kubernetes manifest の image レジストリ URL も全更新。
gcloud artifacts repositories createでリージョナルリポジトリ作成gcloud artifacts docker upgrade migrateで既存 gcr.io イメージを移行- Cloud Build YAML / Kubernetes manifests のイメージ URL を
us-central1-docker.pkg.dev/...に置換 - 段階的にデプロイ → 動作確認
- GCP の公式 deprecation announcements を RSS / Slack 通知で受信
- 「非推奨化したサービスを使い続けない」のテクニカルガバナンスポリシー
- 新規プロジェクトでは必ず Artifact Registry
- 定期的な技術スタックの monitor / refresh(年次の Tech Debt レビュー)
Artifact Analysis の CRITICAL 警告を無視してデプロイ → 既知の脆弱性経由でサーバ侵入
Cloud Run インスタンスから不審な外部通信(マイニング pool への接続)を検知。SCC でアラート発火。
- ベースイメージに含まれる古いライブラリに CVE-XXXX-XXXX(CRITICAL)あり
- Artifact Analysis のスキャン結果でフラグが立っていたが、「動作には問題ない」と判断してデプロイ
- その CVE は RCE(リモートコード実行)可能 → 攻撃者が侵入
- 侵入後、マイニングプログラムをダウンロードして実行
侵入されたインスタンスを介して他コンテナへの横展開を試みられた(VPC Firewall で防御済み)。フォレンジック調査 1週間。Cloud Run の請求が異常増加した期間の費用は不正利用申告で免除。
- 侵入されたリビジョンを即座にロールバック + 全インスタンス停止
- 脆弱なベースイメージ更新(最新セキュリティパッチ適用)
- Buildpacks 採用に切り替え、ベースイメージの自動更新を有効化
- SCC で侵入経路と横展開有無を確認
- Cloud Build パイプラインで HIGH/CRITICAL 脆弱性があればビルド失敗 させる
- Binary Authorization のポリシーで「脆弱性スキャン Pass」を必須化(vulnerability-attestor)
- ベースイメージはセキュリティパッチが自動適用される Buildpacksを採用
- 定期的なイメージ再ビルド(毎週 cron で同じソースから再ビルド → パッチ適用版が自動生成)
- SCC で脆弱性アラートを Slack に通知し、72時間以内対応の SLO
Buildpacks のベースイメージが自動更新 → C 拡張のバイナリ互換性が壊れて起動失敗
Cloud Build は成功するが、Cloud Run へのデプロイ後にコンテナが起動直後にクラッシュ。Cloud Logging に ImportError: libpython3.x.so.1.0: undefined symbol。
- Buildpacks がベースイメージを
python:3.11-slimからpython:3.12-slimに自動更新 - pre-built C 拡張(numpy, pandas, psycopg2-binary)が Python 3.11 向けにビルドされていた
- 3.12 で ABI 互換性なし → import 時にクラッシュ
本番リリース 30分後にユーザー影響が顕在化、緊急ロールバック。リリース計画 2日延期。
- 前リビジョンに即時ロールバック
runtime.txtまたはproject.tomlで Python バージョンを 3.11 にピン留め- requirements.txt のバージョンも具体的に固定(
numpy==1.26.4) - 3.12 移行用の別ブランチで時間をかけて検証
- Buildpacks 利用時はランタイムバージョンを明示的にピン留め
- 本番リリース前に staging で Buildpacks のビルド出力を検証
- 言語バージョンの自動更新を許容する場合は、変更ログを Slack 通知
- クリティカルな依存(C 拡張)は requirements.txt で厳密バージョン指定
セクション2 試験戦略まとめ
- Container Registry は非推奨、Artifact Registry が標準(最頻出の引っかけ)
- Cloud Shell / Cloud Workstations / Cloud Code の使い分け(特に企業ポリシー要件 → Workstations)
- 🆕 Gemini Cloud Assist / MCP / AI コーディングアシスタント の名前を確実に覚える
- Cloud Build シークレット = Secret Manager +
availableSecrets+secretEnv+$$VAR - 並列ステップ =
waitFor: ['-'] - SLSA L3 = Cloud Build 標準、provenance + attestation + Binary Authorization の流れ
- Buildpacks = Dockerfile 不要、
--source .でデプロイ
- 「新規プロジェクトでイメージリポジトリ」 → Artifact Registry
- 「企業の標準開発環境を強制」 → Cloud Workstations
- 「AI が外部リソースに接続」 → MCP サーバー
- 「改ざんイメージのデプロイ阻止」 → Binary Authorization
- 「ビルド証跡 / 真贋検証」 → provenance(SLSA L3)
- 「Dockerfile を書かずデプロイ」 →
gcloud run deploy --source .(Buildpacks) - 「Cloud Build でビルド時間短縮」 → マシン強化 + 並列 + キャッシュ + .gcloudignore
- 「PR ごとに自動テスト」 → Cloud Build の Pull Request トリガー