試験概要
Google Cloud Professional Cloud DevOps Engineer認定試験は、実務重視のDevOps実装スキルを問う資格です。SRE(Site Reliability Engineering)の実践、CI/CDパイプラインの構築、監視・ロギング戦略の技術をカバーします。
最近のバージョンでは従来のSRE文化的側面よりも技術実装に重点を置いた改定が行われました。
試験概要と受験情報
基本的な試験情報
試験名称:Professional Cloud DevOps Engineer
受験料:200ドル(税別)※日本円で約3万円
試験時間:120分(2時間)
問題数:50-60問(複数選択式・複数選択肢式)
合格基準:合格/不合格のみ(数値スコア非表示)
有効期限:2年間
受験方法と要件
受験方法:
- オンライン監督試験(自宅・オフィス)
- テストセンター受験
学習中(Udemy講座)
試験範囲と出題比重
SRE(Site Reliability Engineering)の核心概念
SLI、SLO、SLAの定義と実装
Service Level Indicators(SLI):
- サービスレベルの定量的測定指標
- 主要指標:リクエスト待機時間、エラー率、システム処理能力、可用性
- ベストプラクティス:平均値ではなくパーセンタイル(90th、99th、99.9th)を使用
# SLI設定例
availability_sli:
good_total_ratio:
good_service:
filter: 'resource.type="gce_instance" AND metric.label.response_code<"500"'
total_service:
filter: 'resource.type="gce_instance"'
Service Level Objectives(SLO):
- SLIによって測定されるサービスレベルの目標値
- 構造:「SLI ≤ 目標値」または「下限 ≤ SLI ≤ 上限」
- 例:「Get RPCコールの99%が100ms以内に完了する」
- 重要原則:イノベーションとデプロイ速度を確保するため常に100%未満に設定
Service Level Agreements(SLA):
- SLOを満たさない場合の明示的・暗黙的な契約と結果
- SLOとの違い:「満たされない場合の結果」の有無
- 通常、財務上のペナルティ、返金、その他のビジネス上の結果を含む
エラーバジェット管理
エラーバジェットの計算:
エラーバジェット = 100% - SLO目標パーセンテージ
実用例:
- 99.9%可用性SLO = 0.1%エラーバジェット
- 30日間では約43分のダウンタイム許容
エラーバジェットポリシー:
- 消費率50%未満:通常運用
- 消費率50-75%:監視強化、ポストモーテム要求
- 消費率75-100%:デプロイ凍結、信頼性向上に集中
トイル削減戦略
トイルの定義(Google SRE):
- 手動で反復的、永続的価値のない作業
- サービスサイズに比例してスケール
- 反応的であり、予防的でない
- 自動化可能な作業
削減手法:
- 自動化:スクリプト、ワークフロー、自己修復システム
- 排除:不要なプロセスや手動ステップの除去
- 標準化:チーム全体での共通ツール・プロセス採用
- セルフサービス:開発者による日常運用の自動化
- 目標:SRE時間の50%未満に抑制
CI/CDパイプライン構築の実践
Cloud BuildとCloud Deployの活用
Cloud Build設定例:
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/myapp:$BUILD_ID', '.']
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/myapp:$BUILD_ID']
- name: 'gcr.io/cloud-builders/gke-deploy'
args:
- run
- --filename=k8s/
- --image=gcr.io/$PROJECT_ID/myapp:$BUILD_ID
- --cluster=production-cluster
- --location=us-central1-a
# Binary Authorization統合
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud container binauthz attestations sign-and-create \
--artifact-url=gcr.io/$PROJECT_ID/myapp:$BUILD_ID \
--attestor=production-attestor \
--keyversion=projects/$PROJECT_ID/locations/global/keyRings/binauthz/cryptoKeys/attestor-key/cryptoKeyVersions/1
Cloud Deploy設定:
# clouddeploy.yaml
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: production-pipeline
serialPipeline:
stages:
- targetId: staging
profiles: [staging]
- targetId: production
profiles: [production]
strategy:
canary:
runtimeConfig:
kubernetes:
serviceNetworking:
service: "my-service"
canaryDeployment:
percentages: [25, 50, 100]
verify: true
GitOps実装方法
Pull型GitOps(推奨):
- デプロイメントエージェントがGitリポジトリを継続的にポーリング
- 望ましい状態と実際の状態を調整
- セキュリティ強化(認証情報はクラスター内に保持)
- 複雑なマルチクラスター環境に適合
- 推奨ツール:ArgoCD、Flux、Config Connector
デプロイメント戦略の使い分け
ローリングデプロイメント:
- Kubernetesデフォルト戦略
- 古いポッドを新しいポッドに段階的に置換
-
maxSurge
とmaxUnavailable
で制御 - リソースオーバーヘッド最小
Blue-Greenデプロイメント:
- 2つの同一環境(blue/green)を維持
- トラフィックを瞬時に切り替え
- ゼロダウンタイムデプロイメント
- デプロイ期間中はリソースが2倍必要
Canaryデプロイメント:
- 古いバージョンから新しいバージョンに段階的にトラフィックシフト
- リスク軽減と実ユーザーフィードバック収集
- Google Cloud Deployが自動化機能を提供
監視とロギングの包括的戦略
4つのゴールデンシグナル(Google SRE)
レイテンシ(Latency):
- リクエスト処理時間
- 重要:成功と失敗のレイテンシを区別
- 高パーセンタイル(95th、99th、99.9th)を監視、平均値は不十分
トラフィック(Traffic):
- システム需要の測定
- Webサービス:HTTP requests/second
- ストレージシステム:I/O operations/second
- 他のシグナルを解釈するためのコンテキスト
エラー(Errors):
- 失敗リクエストの割合
- 明示的失敗:HTTP 500、例外
- 暗黙的失敗:HTTP 200だが不正コンテンツ
- インフラとアプリケーションレベルの検出が必要
サチュレーション(Saturation):
- サービスの「満杯度」
- 制約の多いリソース(CPU、メモリ、I/O、ネットワーク)に注目
- システムは100%使用率前に性能劣化
- 予測的指標:「データベースは4時間で満杯になる」
Cloud Monitoringでの実装
カスタムメトリクス作成:
# Python例:カスタムメトリクス送信
from google.cloud import monitoring_v3
client = monitoring_v3.MetricServiceClient()
project_name = f"projects/{project_id}"
# カスタムメトリクス記録
series = monitoring_v3.TimeSeries()
series.metric.type = "custom.googleapis.com/my_metric"
series.resource.type = "gce_instance"
series.resource.labels["instance_id"] = "my-instance-id"
point = series.points.add()
point.value.double_value = 42.0
point.interval.end_time.GetCurrentTime()
client.create_time_series(name=project_name, time_series=[series])
アラートポリシー設定:
# Monitoring Query Language (MQL) アラート例
displayName: "High Error Rate Alert"
conditions:
- displayName: "HTTP Error Rate > 5%"
conditionThreshold:
filter: 'resource.type="gce_instance" metric.type="compute.googleapis.com/instance/up"'
comparison: COMPARISON_GT
thresholdValue: 0.05
duration: "300s"
alertStrategy:
autoClose: "1800s"
notificationChannels:
- "projects/my-project/notificationChannels/slack-channel"
Cloud Loggingの最適化
構造化ログの推奨形式:
{
"severity": "ERROR",
"timestamp": "2025-09-15T10:00:00Z",
"message": "Database connection failed",
"labels": {
"service": "user-api",
"version": "v1.2.3",
"environment": "production"
},
"httpRequest": {
"requestMethod": "GET",
"requestUrl": "/api/users",
"responseSize": "0"
},
"trace": "projects/my-project/traces/12345"
}
ログエクスポート設定:
# BigQueryエクスポート(長期分析用)
gcloud logging sinks create bigquery-export \
bigquery.googleapis.com/projects/my-project/datasets/logs_dataset \
--log-filter='severity>=ERROR AND resource.type="gce_instance"'
# Cloud Storageエクスポート(アーカイブ用)
gcloud logging sinks create storage-archive \
storage.googleapis.com/my-logs-bucket \
--log-filter='timestamp<"-P30D"'
分散トレーシングの実装
OpenTelemetry統合例:
# Python OpenTelemetry設定
from opentelemetry import trace
from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
# トレーサー設定
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
# Cloud Traceエクスポーター
cloud_trace_exporter = CloudTraceSpanExporter()
span_processor = BatchSpanProcessor(cloud_trace_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)
# 使用例
def process_request():
with tracer.start_as_current_span("process_request") as span:
span.set_attribute("user.id", "12345")
span.set_attribute("request.type", "api_call")
# ビジネスロジック
result = perform_database_operation()
span.set_attribute("result.status", "success")
return result
セキュリティとコンプライアンス
Binary Authorizationによるコンテナ検証
ポリシー設定例:
# Binary Authorization ポリシー
globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
requireAttestationBy:
- projects/my-project/attestors/security-attestor
- projects/my-project/attestors/qa-attestor
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
clusterAdmissionRules:
us-central1-c.production-cluster:
requireAttestationBy:
- projects/my-project/attestors/production-attestor
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
CI/CDパイプライン統合:
# アテステーション作成
gcloud container binauthz attestations sign-and-create \
--artifact-url=gcr.io/my-project/app:${BUILD_ID} \
--attestor=security-attestor \
--keyversion=projects/my-project/locations/global/keyRings/binauthz/cryptoKeys/attestor-key/cryptoKeyVersions/1
Workload Identityの実装
設定例:
# Workload Identity設定
gcloud iam workload-identity-pools create github-pool \
--location=global \
--description="Pool for GitHub Actions"
# プロバイダー作成
gcloud iam workload-identity-pools providers create-oidc github-provider \
--location=global \
--workload-identity-pool=github-pool \
--issuer-uri=https://token.actions.githubusercontent.com \
--attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository"
# サービスアカウント紐付け
gcloud iam service-accounts add-iam-policy-binding \
--role="roles/iam.workloadIdentityUser" \
--member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/github-pool/attribute.repository/my-org/my-repo" \
my-service-account@my-project.iam.gserviceaccount.com
Secret Manager統合
CI/CDでの活用:
# Cloud Build with Secret Manager
steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'bash'
args:
- '-c'
- |
echo "$$API_KEY" > /tmp/api-key
# APIキーを使用した処理
availableSecrets:
secretManager:
- versionName: projects/my-project/secrets/api-key/versions/latest
env: API_KEY
実践コード例とコマンド集
よく使用するgcloudコマンド
# プロジェクト管理
gcloud projects list
gcloud config set project PROJECT_ID
# GKE操作
gcloud container clusters create production-cluster \
--zone=us-central1-a \
--enable-private-nodes \
--enable-network-policy
# Cloud Build
gcloud builds submit --config=cloudbuild.yaml
# Binary Authorization
gcloud container binauthz policy import policy.yaml
# Secret Manager
gcloud secrets create db-password --data-file=password.txt
gcloud secrets versions access latest --secret=db-password
# Monitoring
gcloud logging sinks create bigquery-export \
bigquery.googleapis.com/projects/PROJECT_ID/datasets/logs
# IAM
gcloud iam service-accounts create my-service-account
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:my-service-account@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/container.developer"
Kubernetesマニフェスト例
# デプロイメント戦略
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
spec:
serviceAccountName: workload-identity-sa
containers:
- name: myapp
image: gcr.io/PROJECT_ID/myapp:latest
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5