📚 GCP PCA 学習: 2026-06-07
セクション: 5.2 GCP SDK を使った Google Cloud との連携 前回からの繋がり: IaC と Terraform で「環境をコード化」したら、実務では gcloud・gsutil・bq などのコマンドライン SDK で日々の操作・自動化・パイプライン構築を行う。SDK は「インフラ設定」から「データ操作」まで全サービスを統一インターフェースで操作できる仕組み。
① 一言サマリー
「GCP SDK とは、ローカル・CI-CD・Cloud Shell から Google Cloud のあらゆるサービスを操作するための統一ツールセット」。Cloud Console(UI)だけでなく、スクリプト・自動化・パイプラインをコード化する基盤。
② たとえ話
家に例えるなら: - Google Cloud Console = 物理的にドアベルを押して家の管理人に頼む(UI で操作、遅い、リスク) - gcloud / gsutil / bq = 家の管理人に「電話で指示する」(コマンドライン、速い、スクリプト化できる) - クライアントライブラリ(Python・Go・Node.js) = 家の管理人の「内線番号を知る」(プログラムから直接呼び出し、最速) - Cloud Shell = どこからでも「Wi-Fi で電話かけられる」(環境セットアップ不要、GCP 上で実行)
すべての方法が同じサービスを操作しているが、「誰が・どこから・どう操作するか」で使い分ける。
③ 図解
graph LR
DevLocal["💻 ローカルPC
gcloud CLI"]
DevCI["⚙️ CI-CD パイプライン
Terraform / gcloud"]
DevShell["☁️ Cloud Shell
gcloud / gsutil / bq"]
AppCode["📱 アプリケーション
Python / Go / Node.js"]
GCP["🔧 Google Cloud API
(全サービスの統一インターフェース)"]
Services["サービス群
Compute / Storage / BigQuery
IAM / Monitoring / etc"]
DevLocal --> GCP
DevCI --> GCP
DevShell --> GCP
AppCode --> GCP
GCP --> Services
style GCP fill:#4285F4,color:#fff
style Services fill:#34A853,color:#fff
style DevLocal fill:#FBBC04,color:#000
style DevCI fill:#EA4335,color:#fff
style DevShell fill:#A142F4,color:#fff
style AppCode fill:#00BCD4,color:#fff
④ 仕組みの深掘り
gcloud CLI の内部動作
- 認証(Authentication)
gcloud auth loginで Google アカウント認証 → OAuth 2.0 トークン取得gcloud config set project IDでデフォルトプロジェクト指定- Service Account キーを使う場合:
gcloud auth activate-service-account --key-file=... -
トークンは
~/.config/gcloud/application_default_credentials.jsonに自動保存 -
API 呼び出しの仕組み
- gcloud コマンドはすべてREST API(JSON)または RPC API(gRPC)にマッピング
- 例:
gcloud compute instances create my-vm→/compute/v1/projects/{project}/zones/{zone}/instancesへ POST -
gcloud はこの API 呼び出しを「ラップして、人間が読みやすいコマンドにしたもの」
-
CLI 引数 → API リクエストの変換
↓gcloud compute instances create my-vm \ --zone=us-central1-a \ --machine-type=n1-standard-1 \ --image-family=debian-12 \ --image-project=debian-cloud{ "name": "my-vm", "zone": "zones/us-central1-a", "machineType": "zones/us-central1-a/machineTypes/n1-standard-1", "disks": [{ "sourceImage": "projects/debian-cloud/global/images/family/debian-12" }] } -
非同期オペレーション(Long-running Operation)
- Compute Engine VM 作成・削除は数秒~数分かかる
- gcloud は Operation ID を取得し、
--asyncで即座に返すか、--waitで完了を待つ -
背景:GCP API は大規模操作を非同期で処理するため、ポーリング(Operation.get())で進捗確認
-
レート制限・リトライ
- gcloud は自動的にExponential Backoffでリトライ(指数関数的待機)
- 429 Too Many Requests → 1 秒待機 → リトライ → 2 秒待機 → リトライ...
- 本来は手動で実装する必要があるが、gcloud・SDK が自動化している
認証スコープ(Scopes)
Service Account の権限は「IAM Role(粗粒度)」と「OAuth Scopes(細粒度)」の 2 段階で制御:
┌─────────────────────────────────────────┐
│ IAM Role: compute.admin │ ← 「Compute Engine 全権」
│ (what you can do) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ OAuth Scopes: cloud-platform │ ← 「すべての Scope を有効」
│ (which APIs you can reach) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Actual: Compute Engine API 呼び出し OK │
└─────────────────────────────────────────┘
Scope が https://www.googleapis.com/auth/compute.readonly だけの場合、IAM Role が compute.admin でも「読み取り専用」に制限される。
Cloud Shell の優位性
local PC Cloud Shell
─────────────────────────────────────
gcloud インストール プリインストール ✓
Python / Go 環境構築 各言語プリセット ✓
API 認証情報セットアップ GCP に統合 ✓
ファイル転送 クラウドストレージ直結 ✓
セッション保持 Cloud Persistent Disk で自動 ✓
→ 結論:初学者・試験勉強 → Cloud Shell、本番 CI-CD → gcloud in Container
⑤ 他サービスとの使い分け
| 用途 | 選定サービス | 理由 |
|---|---|---|
| 単発のコマンド実行 | gcloud CLI | gcloud compute instances list 1 行で完結 |
| 複数サービスの連鎖操作 | gcloud CLI + Bash スクリプト | リスト反復・条件分岐が容易 |
| インフラ IaC・宣言的管理 | Terraform(gcloud ではなく) | 冪等性・差分検出・State 管理が必須 |
| 本番パイプラインから GCP 操作 | Cloud Build + gcloud / API | CI-CD ネイティブな認証・監査ログ自動記録 |
| アプリケーション内からの操作 | クライアントライブラリ(Python・Go・Node.js) | SDK が API エラーハンドリング・リトライを自動化 |
| 一時的な検証・デバッグ | Cloud Shell | 環境準備ゼロ・GCP リソースに直結 |
| 大規模ファイル転送 | gsutil(+並列転送) | マルチパート・リトライ・チェックサム自動 |
| BigQuery 探索クエリ | bq CLI(+--max_rows=1000) |
SQL 実行・結果取得が 1 コマンド |
PCA 試験の判断軸: - UI(Console)を指定する選択肢 → 「スケーラビリティに欠ける」× - gcloud だけで足りる場合に Terraform 選択 → 「複雑性の過剰」× - API 呼び出しが必須な場合に Cloud Shell で gcloud だけ → 「認証・監査ログ不備」×
⑥ 実務への応用
例 1: Web スタートアップの CI-CD パイプライン
# Cloud Build の cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/gke-deploy'
args: ['run', '--help']
- name: 'gcr.io/cloud-builders/gcloud'
args:
- 'container'
- 'images'
- 'scan'
- 'gcr.io/$PROJECT_ID/my-app:$COMMIT_SHA'
- name: 'gcr.io/cloud-builders/kubectl'
args: ['set', 'image', 'deployment/my-app', 'my-app=gcr.io/$PROJECT_ID/my-app:$COMMIT_SHA']
env: ['CLOUDSDK_COMPUTE_ZONE=us-central1-a', 'CLOUDSDK_CONTAINER_CLUSTER=my-cluster']
→ git push すると: 1. Dockerfile ビルド 2. gcloud で脆弱性スキャン 3. kubectl で GKE にローリングアップデート 4. デプロイ完了ログが Cloud Logging に記録 すべてが自動化・監査可能。
例 2: BigQuery 夜間バッチ処理
# Cloud Scheduler(毎晩 0:00 JST)から実行
#!/bin/bash
bq query --use_legacy_sql=false \
--destination_table=project.dataset.daily_summary \
--replace \
'SELECT DATE(timestamp) as date, COUNT(*) as cnt FROM `project.dataset.events` GROUP BY date'
# 結果を Slack に通知
curl -X POST https://hooks.slack.com/... \
-d "Processed $(bq query --use_legacy_sql=false 'SELECT COUNT(*) FROM project.dataset.daily_summary' --format=csv | tail -1) rows"
→「誰が・何を・いつ実行した」が Cloud Audit Logs に自動記録 → 監査対応・トラブルシューティングが容易。
例 3: 受託開発で複数環境管理
# 開発環境・ステージング・本番で異なるプロジェクト
export PROJECTS=('dev-project' 'staging-project' 'prod-project')
export ZONES=('us-central1-a' 'us-central1-b' 'us-central1-c')
for i in "${!PROJECTS[@]}"; do
gcloud config set project ${PROJECTS[$i]}
gcloud compute instances create "web-$(date +%s)" \
--zone=${ZONES[$i]} \
--machine-type=n1-standard-1 \
--image-family=debian-12
done
→ 1 スクリプトで 3 環境すべてに同じ構成を自動デプロイ(ドリフト防止)。
⑦ よくある誤解・落とし穴
誤解 1: 「gcloud コマンドはすべて Cloud Shell で」
❌ 誤り:
# Cloud Shell で手動実行したら OK?
gcloud compute instances create --image...
✓ 正解: - 本番は Cloud Build(CI-CD)で gcloud を実行 → Cloud Audit Logs に記録 - Cloud Shellで手動実行 → 監査ログが「Cloud Shell ユーザー」に紐付き、後で「誰がやったか」追跡困難
PCA 試験的判定:「自動化・監査可能性」が評価軸。
誤解 2: 「Service Account キーはコードに埋め込む」
❌ 危険:
# .py ファイルに埋め込んだら git に commit されて漏洩
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/path/to/key.json' # ❌ コード埋め込み
✓ 正解:
# Workload Identity Federation(信頼できるリソースから認証)
# または Secret Manager を使用
gcloud secrets create db-password --data-file=- < password.txt
Service Account キーは生成しない(Workload Identity で認証)。
誤解 3: 「API リファレンスを見ながら REST API を curl で叩く」
❌ 非効率:
curl -X POST https://compute.googleapis.com/compute/v1/projects/...
-H "Authorization: Bearer $(gcloud auth print-access-token)"
-H "Content-Type: application/json"
-d '{...}'
✓ 推奨:
gcloud compute instances create my-vm --zone=us-central1-a # 1 コマンド
ただし「カスタム API フィールドをセットしたい」場合のみ REST API を使う。
誤解 4: 「oauth2l(OAuth トークン生成ツール)をいちいち実行する」
❌ 手動管理:
oauth2l fetch --client_secret=... cloud-platform
# トークンが期限切れ → 再実行
✓ gcloud が自動管理:
gcloud auth login # 1 回だけ
gcloud compute instances list # 以降はトークン自動更新
誤解 5: 「bq query の結果を Python で処理するなら BigQuery API を直接使う」
❌ 複雑:
from google.cloud import bigquery
client = bigquery.Client()
job = client.query("SELECT ...") # 非同期
result = job.result() # ポーリング待機
✓ gcloud + Bash パイプ(小規模):
bq query --use_legacy_sql=false --format=csv \
'SELECT * FROM table LIMIT 1000' | python process.py
ただし「大規模(100GB+)・リアルタイム・複数クエリの並列実行」なら Python SDK が必須。
誤解 6: 「gcloud は単なる UI ラッパー」
❌ 誤解:
# Cloud Console で VM 作成 = gcloud compute instances create で OK?
実際:
- gcloud は Console より豊富なオプションを持つ(例:--create-disk で詳細ディスク設定)
- gcloud でしかできない機能も多い(例:--async で非同期実行)
- PCA 試験:gcloud の存在を知っていることが前提
⑧ 理解度チェック
次のシナリオで最適なアプローチを選んでください:
「Web スタートアップが GCP で新しい Compute Engine インスタンスを開発・ステージング・本番の 3 環境に自動デプロイしたい。変更管理・監査ログ・段階的ロールアウトをすべて満たす必要があります。どのツールの組み合わせを選びますか?
- (A) Cloud Shell で
gcloud compute instances createを 3 回実行 - (B) Terraform + Cloud Build(Git push → 自動デプロイ)+ Service Account 認証
- (C) Cloud Console UI で手動作成 → 3 環境に復製
- (D) gcloud コマンドを Python スクリプトで実行し、ローカルから手動実行」
答え(クリック)
**正解:(B) Terraform + Cloud Build(Git push → 自動デプロイ)+ Service Account 認証** **各選択肢の評価**: - **(A) Cloud Shell で `gcloud compute instances create` を 3 回実行**:gcloud は便利だが手動実行のため「誰がいつ変更したか」の監査ログが曖昧になり、変更管理ゲートが機能しない。繰り返し実行性も低い(毎回手入力のリスク)。 - **(B) Terraform + Cloud Build(Git push → 自動デプロイ)+ Service Account 認証**:✓ 正解。理由は以下: 1. **Terraform**:IaC で「3 環境の構成を宣言的に管理」→ ドリフト検出・再現性確保 2. **Cloud Build**:Git push トリガー → 自動デプロイ → Cloud Audit Logs に「誰が・どのコミット・いつ」を記録 3. **段階的ロールアウト**:Terraform Workspace で環境分離 + Cloud Deploy で Canary リリース 4. **Service Account**:Human キーを避け、Workload Identity で認証 → 監査可能 - **(C) Cloud Console UI で手動作成 → 3 環境に復製**:UI は「マウスクリック」ベースのため、スクリプト化・自動化・監査が不可能。PCA 試験では即 ×。 - **(D) gcloud コマンドを Python スクリプトで実行し、ローカルから手動実行**:gcloud の 3 回実行と同じ問題。「ローカルから手動」という点で、変更管理ゲート・監査ログの一元化が失われる。本番運用では Service Account キーをローカルに配置する必要があり、セキュリティリスク。⑨ 深掘り補足
最新 GA 機能(2026 年 6 月)
-
Cloud Location Finder(GA):位置情報ベースのリソース検出。
gcloud locations listで対応リージョン確認可能。 -
gcloud Syntax Suggestion(Preview):gcloud コマンド入力時に AI が正しいフラグ・値を提案する機能。
gcloud compute instances create --ai-hintsで試験的に利用可能。
gcloud の内部実装
gcloud は Pythonで実装されており、~/.config/gcloud/ 配下に:
- properties:デフォルトプロジェクト・ゾーン・エディタ等の設定
- configurations/:複数プロファイル管理(gcloud config configurations list)
- application_default_credentials.json:OAuth トークン(自動更新)
# 複数プロファイル切り替え
gcloud config configurations list
gcloud config configurations activate dev-project
gcloud config configurations activate prod-project
API 呼び出しのデバッグ
# API リクエスト・レスポンスの詳細ログを表示
gcloud compute instances create my-vm --log-http
PCA 試験では「gcloud がバックグラウンドで何の API を呼び出しているか」を理解することで、トラブルシューティング・最適化ができるようになる。
クライアントライブラリ(Python の例)
from google.cloud import compute_v1
from google.api_core.gapic_v1 import client_info
# 自動リトライ・タイムアウト設定
client = compute_v1.InstancesClient(
client_options={
'api_audience': 'https://www.googleapis.com',
'client_info': client_info.ClientInfo(gapic_version='v1')
}
)
# 非同期オペレーション
operation = client.insert(project='my-project', zone='us-central1-a', body={...})
print(f"Operation ID: {operation.name}")
クライアントライブラリは gcloud より低レベルだが、プログラム内での詳細制御が可能。「アプリケーション内から GCP リソース操作」が必須ならクライアントライブラリ、「CI-CD パイプラインから簡潔に実行」なら gcloud。
Workload Identity Federation(推奨認証方式)
Service Account キーの生成を避けるための最新パターン:
# GitHub Actions から GCP へ認証(キーなし)
- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
with:
workload_identity_provider: 'projects/123456/locations/global/workloadIdentityPools/github-pool/providers/github-provider'
service_account: 'github-actions@my-project.iam.gserviceaccount.com'
- name: Deploy
run: gcloud compute instances ...
PCA 試験では「Workload Identity Federation を使っている」設計が最高点。Service Account キーは「レガシー(後方互換性のため残存)」。
次回: 6.1 モニタリング・ロギング・プロファイリング・アラートの設計