mcpField
A
aws-cloud-patterns

aws-cloud-patterns

github.com/rohitg00云与 DevOps2.8k179 次安装24 周前更新
代码仓库

关于 aws-cloud-patterns

aws-cloud-patterns 是面向 AWS 应用与基础设施开发者的技能,提供 Lambda、DynamoDB、CDK 和 S3 事件处理模式及检查项。

主要功能

  1. 01Lambda 处理程序与 SDK 客户端模式
  2. 02DynamoDB 单表设计
  3. 03CDK 基础设施示例
  4. 04S3 事件处理模式
  5. 05IAM 与运维防护
  6. 06基础设施检查清单

适用场景

  1. 01组织 Lambda API 处理程序
  2. 02规划 DynamoDB 访问模式
  3. 03使用 CDK 定义 AWS 基础设施
  4. 04处理 S3 事件记录

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/rohitg00/awesome-claude-code-toolkit --skill aws-cloud-patterns

安装后在 Claude Code 中输入/aws-cloud-patterns确认已加载。

详细介绍

AWS Cloud Patterns

Lambda 函数模式

import { APIGatewayProxyHandlerV2 } from "aws-lambda";
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, GetCommand } from "@aws-sdk/lib-dynamodb";

const client = DynamoDBDocumentClient.from(new DynamoDBClient({}));

export const handler: APIGatewayProxyHandlerV2 = async (event) => {
  const id = event.pathParameters?.id;
  if (!id) {
    return { statusCode: 400, body: JSON.stringify({ error: "Missing id" }) };
  }

  const result = await client.send(
    new GetCommand({ TableName: process.env.TABLE_NAME!, Key: { pk: id } })
  );

  if (!result.Item) {
    return { statusCode: 404, body: JSON.stringify({ error: "Not found" }) };
  }

  return {
    statusCode: 200,
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(result.Item),
  };
};

在处理程序外初始化 SDK 客户端,以便在多次调用之间复用连接。

DynamoDB 单表设计

interface OrderItem {
  pk: string;          // USER#<userId>
  sk: string;          // ORDER#<orderId>
  gsi1pk: string;      // ORDER#<orderId>
  gsi1sk: string;      // ITEM#<itemId>
  entityType: string;  // "Order" | "OrderItem"
  data: Record<string, any>;
  ttl?: number;
}

const params = {
  TableName: "AppTable",
  KeyConditionExpression: "pk = :pk AND begins_with(sk, :prefix)",
  ExpressionAttributeValues: {
    ":pk": `USER#${userId}`,
    ":prefix": "ORDER#",
  },
};

先设计访问模式,再对键进行建模。使用 GSI 支持其他查询模式。

CDK 基础设施

import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as lambda from "aws-cdk-lib/aws-lambda-nodejs";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
import * as apigateway from "aws-cdk-lib/aws-apigatewayv2";

export class ApiStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const table = new dynamodb.Table(this, "AppTable", {
      partitionKey: { name: "pk", type: dynamodb.AttributeType.STRING },
      sortKey: { name: "sk", type: dynamodb.AttributeType.STRING },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      pointInTimeRecovery: true,
      removalPolicy: cdk.RemovalPolicy.RETAIN,
    });

    const fn = new lambda.NodejsFunction(this, "ApiHandler", {
      entry: "src/handler.ts",
      runtime: cdk.aws_lambda.Runtime.NODEJS_22_X,
      architecture: cdk.aws_lambda.Architecture.ARM_64,
      memorySize: 256,
      timeout: cdk.Duration.seconds(10),
      environment: { TABLE_NAME: table.tableName },
    });

    table.grantReadWriteData(fn);
  }
}

S3 事件处理

import { S3Event } from "aws-lambda";
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";

const s3 = new S3Client({});

export async function handler(event: S3Event) {
  for (const record of event.Records) {
    const bucket = record.s3.bucket.name;
    const key = decodeURIComponent(record.s3.object.key.replace(/\+/g, " "));

    const obj = await s3.send(new GetObjectCommand({ Bucket: bucket, Key: key }));
    const body = await obj.Body?.transformToString();

    await processFile(key, body);
  }
}

反模式

  • 硬编码 AWS 凭证,而不是使用 IAM 角色
  • 未恰当设置 Lambda 超时和内存
  • 在 DynamoDB 上使用相当于 SELECT * 的扫描,而不是使用带键条件的查询
  • 为每个 CRUD 操作创建一个 Lambda,而不是按领域分组
  • 未为错误率和限流设置 CloudWatch 警报
  • 未在 DynamoDB 表上启用时间点恢复

检查清单

  • 在 Lambda 处理程序外初始化 SDK 客户端
  • IAM 角色遵循最小权限原则
  • 在设计表架构前设计好 DynamoDB 访问模式
  • Lambda 使用 ARM64 架构以节省成本
  • S3 存储桶启用版本控制和生命周期策略
  • 为 Lambda 错误、持续时间和限流设置 CloudWatch 警报
  • 将基础设施定义为代码(CDK 或 Terraform)
  • 将密钥存储在 Systems Manager Parameter Store 或 Secrets Manager 中

评论

支持 Markdown