
专门用于在AWS上构建生产级无服务器应用程序的技能。涵盖Lambda函数、API Gateway、DynamoDB、SQS/SNS事件驱动模式、SAM/CDK部署和冷启动优化。技能概述aws-serverless 技能是一个专门用于构建生产级无服务器应用程序的综合技能。它提供了在AWS平台上开发和部署无服务器架构的最佳实践包括Lambda函数、API Gateway、DynamoDB、SQS/SNS事件驱动模式以及使用SAM/CDK进行部署和冷启动优化。下载地址https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/aws-serverless核心原则合理设置内存和超时优化前先测量为延迟敏感的工作负载最小化冷启动为Java/.NET函数使用SnapStart对于简单用例优先使用HTTP API而非REST API设计失败处理使用DLQ和重试机制保持部署包小巧使用环境变量进行配置实现带有关联ID的结构化日志记录主要功能Lambda函数开发正确的Lambda函数结构提供Node.js和Python的Lambda处理器模式包含错误处理、客户端初始化和API Gateway响应格式。API Gateway集成REST API和HTTP API集成支持REST API和HTTP API与Lambda的集成提供SAM模板示例和最佳实践。事件驱动模式SQS/SNS事件处理实现基于SQS和SNS的事件驱动架构支持异步消息处理和解耦系统组件。部署和优化SAM/CDK部署使用AWS SAM和CDK进行基础设施即代码部署支持自动化部署和版本控制。API Gateway对比特性HTTP APIREST API延迟更低约10ms较高成本更低便宜50-70%较高功能简单功能较少丰富缓存、请求验证、WAF使用计划不支持支持API密钥和使用计划最佳场景大多数REST API复杂API、企业级功能Lambda处理器模式Node.js示例// handler.js// 在处理器外部初始化在调用之间重用const { DynamoDBClient } require(aws-sdk/client-dynamodb);const { DynamoDBDocumentClient, GetCommand } require(aws-sdk/lib-dynamodb);const client new DynamoDBClient({});const docClient DynamoDBDocumentClient.from(client);// 处理器函数exports.handler async (event, context) {// 可选不等待事件循环清空Node.jscontext.callbackWaitsForEmptyEventLoop false;try {// 根据事件源解析输入const body typeof event.body string? JSON.parse(event.body): event.body;// 业务逻辑const result await processRequest(body);// 返回API Gateway兼容的响应return {statusCode: 200,headers: {Content-Type: application/json,Access-Control-Allow-Origin: *},body: JSON.stringify(result)};} catch (error) {console.error(Error:, JSON.stringify({error: error.message,stack: error.stack,requestId: context.awsRequestId}));return {statusCode: error.statusCode || 500,headers: { Content-Type: application/json },body: JSON.stringify({ error: error.message || Internal server error })};}};Python示例# handler.pyimport jsonimport osimport loggingimport boto3from botocore.exceptions import ClientError# 在处理器外部初始化在调用之间重用logger logging.getLogger()logger.setLevel(logging.INFO)dynamodb boto3.resource(dynamodb)table dynamodb.Table(os.environ[TABLE_NAME])def handler(event, context):try:# 解析输入body (json.loads(event.get(body, {}))if isinstance(event.get(body), str)else event.get(body, {}))# 业务逻辑result process_request(body)return {statusCode: 200,headers: {Content-Type: application/json,Access-Control-Allow-Origin: *},body: json.dumps(result)}except ClientError as e:logger.error(fDynamoDB error: {e.response[Error][Message]})return error_response(500, Database error)except json.JSONDecodeError:return error_response(400, Invalid JSON)except Exception as e:logger.error(fUnexpected error: {str(e)}, exc_infoTrue)return error_response(500, Internal server error)项目结构project/├── template.yaml # SAM模板├── src/│ ├── handlers/│ │ ├── get.js│ │ ├── create.js│ │ └── delete.js│ └── lib/│ └── dynamodb.js└── events/└── event.json # 测试事件最佳实践客户端初始化在处理器外部初始化客户端在温调用之间重用响应格式始终返回正确的API Gateway响应格式结构化日志使用结构化JSON日志以便CloudWatch Insights查询请求追踪在错误日志中包含请求ID以便追踪错误处理实现全面的错误处理和异常捕获环境变量使用环境变量管理配置避免硬编码SAM模板示例HTTP API与Lambda集成# template.yaml (SAM)AWSTemplateFormatVersion: 2010-09-09Transform: AWS::Serverless-2016-10-31Globals:Function:Runtime: nodejs20.xTimeout: 30MemorySize: 256Environment:Variables:TABLE_NAME: !Ref ItemsTableResources:# HTTP API推荐用于简单用例HttpApi:Type: AWS::Serverless::HttpApiProperties:StageName: prodCorsConfiguration:AllowOrigins:- *AllowMethods:- GET- POST- DELETEAllowHeaders:- *# Lambda函数GetItemFunction:Type: AWS::Serverless::FunctionProperties:Handler: src/handlers/get.handlerEvents:GetItem:Type: HttpApiProperties:ApiId: !Ref HttpApiPath: /items/{id}Method: GETPolicies:- DynamoDBReadPolicy:TableName: !Ref ItemsTable# DynamoDB表ItemsTable:Type: AWS::DynamoDB::TableProperties:AttributeDefinitions:- AttributeName: idAttributeType: SKeySchema:- AttributeName: idKeyType: HASHBillingMode: PAY_PER_REQUEST冷启动优化SnapStart为Java/.NET函数启用SnapStart减少冷启动时间内存配置合理配置内存大小内存越大冷启动越快包大小保持部署包小巧减少加载时间预留并发为关键函数配置预留并发保持温启动Provisioned Concurrency为延迟敏感的应用配置预置并发使用限制仅当任务明确符合上述范围时使用此技能不要将输出视为环境特定验证、测试或专家审查的替代品如果缺少所需的输入、权限、安全边界或成功标准请停止并要求澄清