专门用于在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 API | REST 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.js)
context.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.py
import json
import os
import logging
import boto3
from 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(f"DynamoDB 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(f"Unexpected error: {str(e)}", exc_info=True)
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-09'
Transform: AWS::Serverless-2016-10-31Globals:
Function:
Runtime: nodejs20.x
Timeout: 30
MemorySize: 256
Environment:
Variables:
TABLE_NAME: !Ref ItemsTableResources:
# HTTP API(推荐用于简单用例)
HttpApi:
Type: AWS::Serverless::HttpApi
Properties:
StageName: prod
CorsConfiguration:
AllowOrigins:
- "*"
AllowMethods:
- GET
- POST
- DELETE
AllowHeaders:
- "*"# Lambda函数
GetItemFunction:
Type: AWS::Serverless::Function
Properties:
Handler: src/handlers/get.handler
Events:
GetItem:
Type: HttpApi
Properties:
ApiId: !Ref HttpApi
Path: /items/{id}
Method: GET
Policies:
- DynamoDBReadPolicy:
TableName: !Ref ItemsTable# DynamoDB表
ItemsTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
BillingMode: PAY_PER_REQUEST
冷启动优化
- SnapStart:为Java/.NET函数启用SnapStart减少冷启动时间
- 内存配置:合理配置内存大小,内存越大冷启动越快
- 包大小:保持部署包小巧,减少加载时间
- 预留并发:为关键函数配置预留并发保持温启动
- Provisioned Concurrency:为延迟敏感的应用配置预置并发
使用限制
- 仅当任务明确符合上述范围时使用此技能
- 不要将输出视为环境特定验证、测试或专家审查的替代品
- 如果缺少所需的输入、权限、安全边界或成功标准,请停止并要求澄清