gcp-development について
クラウドアプリを構築・運用するエンジニア向けのGoogle Cloud開発スキルです。サーバーレスサービス、データ製品、Terraform、セキュリティ、デプロイ、可観測性の指針をまとめています。
主な機能
- 01Cloud FunctionsとCloud Runの実践
- 02Firestore、BigQuery、Storageの指針
- 03Terraformによるインフラ構成
- 04IAM、シークレット、ネットワークセキュリティ
- 05デプロイと可観測性の実践
活用シーン
- 01Terraform管理のGCPインフラ計画
- 02サーバーレスHTTPまたはバッチ処理の構築
- 03Firestoreデータ設計やBigQueryクエリ調整
- 04クラウドのセキュリティと監視の設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill gcp-developmentインストール後、Claude Code で/gcp-developmentを入力して読み込まれたか確認します。
詳細
GCP 開発のベストプラクティス
概要
このスキルでは、サーバーレスコンピューティング、データサービス、Terraform による Infrastructure as Code、セキュリティのベストプラクティスを含む、Google Cloud Platform(GCP)上でアプリケーションを開発するための包括的なガイドラインを提供します。
基本原則
- GCP クライアントライブラリを使用して、クリーンで適切に構成されたコードを記述します
- すべてのインフラストラクチャ管理に Infrastructure as Code(Terraform)を使用します
- Google Cloud のセキュリティに関するベストプラクティスとコンプライアンスガイドラインに従います
- Cloud Logging による包括的なロギングと、Cloud Monitoring による監視を実装します
コードの構成と構造
Terraform モジュールの構造
infrastructure/
├── main.tf # Primary resources
├── variables.tf # Input variables
├── outputs.tf # Output values
├── versions.tf # Provider versions
├── terraform.tfvars # Variable values
└── modules/
├── compute/
├── storage/
└── networking/
アプリケーションの構造
src/
├── functions/ # Cloud Functions
├── services/ # Cloud Run services
├── shared/ # Shared utilities
└── tests/ # Test files
Cloud Functions のガイドライン
関数の設定
import { HttpFunction } from '@google-cloud/functions-framework';
export const helloWorld: HttpFunction = async (req, res) => {
try {
// Validate request
if (req.method !== 'POST') {
res.status(405).send('Method Not Allowed');
return;
}
// Business logic
const result = await processRequest(req.body);
res.status(200).json(result);
} catch (error) {
console.error('Function error:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
};
ベストプラクティス
- パフォーマンス向上のため、第 2 世代の Cloud Functions を使用します
- 適切なメモリとタイムアウトの上限を設定します
- 設定には環境変数を使用します
- 適切なエラー処理とロギングを実装します
- データベース接続にはコネクションプーリングを使用します
Cloud Run のガイドライン
コンテナのベストプラクティス
- distroless または最小限のベースイメージを使用します
- ヘルスチェックエンドポイントを実装します
- SIGTERM を処理し、正常にシャットダウンできるようにします
- HTTP ワークロードには Cloud Run サービスを使用します
- バッチ処理には Cloud Run ジョブを使用します
Dockerfile の例
FROM node:20-slim AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM gcr.io/distroless/nodejs20-debian12
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["dist/index.js"]
サービスの設定
# service.yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: my-service
spec:
template:
spec:
containers:
- image: gcr.io/PROJECT_ID/my-service
resources:
limits:
memory: 512Mi
cpu: '1'
env:
- name: NODE_ENV
value: production
Firestore のガイドライン
データモデリング
- クエリパターンに基づいてコレクションを設計します
- 階層データにはサブコレクションを使用します
- 複雑なクエリには複合インデックスを実装します
- 複数のドキュメントを更新する場合はバッチ書き込みを使用します
ベストプラクティス
import { Firestore } from '@google-cloud/firestore';
const db = new Firestore();
// Use transactions for atomic operations
await db.runTransaction(async (transaction) => {
const docRef = db.collection('users').doc(userId);
const doc = await transaction.get(docRef);
if (!doc.exists) {
throw new Error('User not found');
}
transaction.update(docRef, {
lastLogin: Firestore.FieldValue.serverTimestamp()
});
});
BigQuery のガイドライン
クエリのベストプラクティス
- パーティション分割テーブルとクラスタ化テーブルを使用します
- 本番クエリでは SELECT * を避けます
- SQL インジェクションを防ぐため、パラメータ化クエリを使用します
- 適切な場合はクエリキャッシュを実装します
コストの最適化
- 予算アラートを設定します
- 予測可能なワークロードにはスロット予約を使用します
- 古いデータを Cloud Storage にアーカイブします
- 繰り返し実行するクエリにはマテリアライズドビューを使用します
Cloud Storage のガイドライン
バケットの設定
- 均一なバケットレベルのアクセスを使用します
- 重要なデータについてはバージョニングを有効にします
- 自動クリーンアップのライフサイクルルールを設定します
- 一時的なアクセスには署名付き URL を使用します
ベストプラクティス
import { Storage } from '@google-cloud/storage';
const storage = new Storage();
const bucket = storage.bucket('my-bucket');
// Generate signed URL for upload
const [url] = await bucket.file('uploads/file.pdf').getSignedUrl({
version: 'v4',
action: 'write',
expires: Date.now() + 15 * 60 * 1000, // 15 minutes
contentType: 'application/pdf',
});
Terraform のベストプラクティス
プロバイダーの設定
terraform {
required_version = ">= 1.0"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
}
backend "gcs" {
bucket = "my-terraform-state"
prefix = "terraform/state"
}
}
provider "google" {
project = var.project_id
region = var.region
}
モジュールのベストプラクティス
- Terraform Registry のバージョン管理されたモジュールを使用します
- 一貫性を保つため、プロバイダーのバージョンを固定します
- 環境を分離するためにワークスペースを使用します
- 暗号化を有効にした Cloud Storage に状態を保存します
セキュリティのベストプラクティス
IAM の設定
- 最小限の権限を持つサービスアカウントを使用します
- GKE には Workload Identity を実装します
- きめ細かなアクセス制御には IAM Conditions を使用します
- Policy Analyzer を使って定期的に監査します
シークレット管理
import { SecretManagerServiceClient } from '@google-cloud/secret-manager';
const client = new SecretManagerServiceClient();
async function getSecret(secretName: string): Promise<string> {
const [version] = await client.accessSecretVersion({
name: `projects/PROJECT_ID/secrets/${secretName}/versions/latest`,
});
return version.payload?.data?.toString() || '';
}
ネットワークセキュリティ
- 機密データには VPC Service Controls を使用します
- DDoS 対策として Cloud Armor を実装します
- 内部サービスには Private Google Access を使用します
- 最小権限の原則に基づいてファイアウォールルールを設定します
デプロイのベストプラクティス
ブルー/グリーンデプロイ
- Cloud Run でトラフィック分割を使用します
- トラフィックを切り替える前にヘルスチェックを実装します
- ロールバック戦略を事前に準備します
- マネージドデプロイには Cloud Deploy を使用します
Cloud Build による CI/CD
# cloudbuild.yaml
steps:
- name: 'node:20'
entrypoint: npm
args: ['ci']
- name: 'node:20'
entrypoint: npm
args: ['test']
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-service', '.']
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/my-service']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
- 'run'
- 'deploy'
- 'my-service'
- '--image=gcr.io/$PROJECT_ID/my-service'
- '--region=us-central1'
可観測性
Cloud Logging
- JSON 形式の構造化ログを使用します
- 分散トレーシングのためにトレース ID を含めます
- 監視用にログベースの指標を設定します
- 長期保存用にログシンクを設定します
Cloud Monitoring
- サービスの SLI と SLO を作成します
- 重要な指標に対するアラートポリシーを設定します
- ビジネス KPI にはカスタム指標を使用します
- エンドポイントに対する稼働時間チェックを実装します
Cloud Trace
import { TraceExporter } from '@google-cloud/opentelemetry-cloud-trace-exporter';
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
const provider = new NodeTracerProvider();
provider.addSpanProcessor(
new BatchSpanProcessor(new TraceExporter())
);
provider.register();
デバッグ戦略
- 本番環境のデバッグには Cloud Debugger を使用します
- Error Reporting によるエラー報告を実装します
- パフォーマンス分析には Cloud Profiler を使用します
- デプロイ前にエミュレーターを使ってローカルでテストします
推奨ツール
- gcloud CLI:GCP をコマンドラインから操作します
- Terraform:コードとしてのインフラストラクチャ
- Cloud Code VS Code Extension:IDE との統合
- Docker:ローカルでのコンテナ化
- Emulator Suite:Firestore、Pub/Sub などのローカルテスト
避けるべきよくある落とし穴
- ワークロードにサービスアカウントを使用しない
- プロジェクト ID や認証情報をハードコーディングする
- Cloud Functions のコールドスタート最適化を無視する
- 適切な IAM バインディングを設定しない
- Cloud Monitoring のアラートを設定し忘れる
- リソースを過剰にプロビジョニングする
- 機密性の高いワークロードに VPC を使用しない
- コスト最適化のベストプラクティスを無視する
コメント
Markdown 対応