关于 gcp-development
面向构建和运维云应用的工程师的 Google Cloud 开发技能,汇集无服务器服务、数据产品、Terraform、安全、部署与可观测性指导。
主要功能
- 01Cloud Functions 和 Cloud Run 实践
- 02Firestore、BigQuery 与 Storage 指导
- 03Terraform 基础设施模式
- 04IAM、密钥与网络安全
- 05部署与可观测性实践
适用场景
- 01规划由 Terraform 管理的 GCP 基础设施
- 02构建无服务器 HTTP 或批处理工作负载
- 03设计 Firestore 数据或优化 BigQuery 查询
- 04配置云安全与监控
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill gcp-development安装后在 Claude Code 中输入/gcp-development确认已加载。
详细介绍
GCP 开发最佳实践
概述
本技能提供在 Google Cloud Platform(GCP)上开发应用程序的综合指南,涵盖无服务器计算、数据服务、使用 Terraform 实现基础设施即代码以及安全最佳实践。
核心原则
- 使用 GCP 客户端库编写简洁、结构良好的代码
- 使用基础设施即代码(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 最佳实践
Provider 配置
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 中带版本号的模块
- 锁定 Provider 版本,确保一致性
- 使用工作区隔离环境
- 将状态存储在 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
- 使用 Cloud Armor 防御 DDoS 攻击
- 对内部服务使用 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