
AWS Lambda 高级模式
Lambda 的无服务器模型消除了服务器管理,但需要理解冷启动、内存/CPU 权衡以及架构模式。
冷启动优化
# 错误:在 handler 内部导入(每次冷启动和热调用都执行)
def handler(event, context):
import boto3 # 慢!
import json
client = boto3.client('s3')
...
# 正确:顶层导入(仅在冷启动时执行)
import boto3
import json
# 在 handler 外部初始化客户端
s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('my-table')
def handler(event, context):
# s3_client 已初始化
response = s3_client.get_object(Bucket='my-bucket', Key='data.json')
return json.loads(response['Body'].read())

预置并发
# serverless.yml / CloudFormation
Resources:
MyFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: my-api
Runtime: python3.12
Handler: index.handler
Code:
ZipFile: |
def handler(event, context):
return {"statusCode": 200, "body": "Hello"}
FunctionVersion:
Type: AWS::Lambda::Version
Properties:
FunctionName: !Ref MyFunction
ProvisionedConcurrency:
Type: AWS::Lambda::ProvisionedConcurrencyConfig
Properties:
FunctionName: !Ref MyFunction
Qualifier: !GetAtt FunctionVersion.Version
ProvisionedConcurrentExecutions: 10 # 预预热 10 个实例
Lambda SnapStart(Java)
// 通过初始化后拍摄快照,加快 Java 冷启动
// 在 AWS SAM 模板中:
// SnapStart:
// ApplyOn: PublishedVersions
@RestController
public class ApiHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
// 这些在快照期间初始化(而非冷启动)
private static final ObjectMapper mapper = new ObjectMapper();
private static final DynamoDbClient dynamoDB = DynamoDbClient.create();
@Override
public APIGatewayProxyResponseEvent handleRequest(
APIGatewayProxyRequestEvent input,
Context context
) {
// 热路径 - 无需初始化
String body = processRequest(input.getBody());
return new APIGatewayProxyResponseEvent()
.withStatusCode(200)
.withBody(body);
}
}

Lambda 层
# 创建包含依赖的层
mkdir -p python/lib/python3.12/site-packages
pip install requests boto3 -t python/lib/python3.12/site-packages/
zip -r my-layer.zip python/
# 发布层
aws lambda publish-layer-version \
--layer-name my-dependencies \
--zip-file fileb://my-layer.zip \
--compatible-runtimes python3.12
# 附加到函数
aws lambda update-function-configuration \
--function-name my-function \
--layers arn:aws:lambda:us-east-1:123456789:layer:my-dependencies:1
Lambda 性能调优
# 使用 AWS Lambda Power Tuning 工具(Step Functions)
# https://github.com/alexcasalboni/aws-lambda-power-tuning
# 输入配置
{
"lambdaARN": "arn:aws:lambda:us-east-1:123:function:my-function",
"powerValues": [128, 256, 512, 1024, 2048, 3008],
"num": 50,
"payload": {"test": "data"},
"parallelInvocation": true,
"strategy": "cost"
}
# 结果显示最佳内存/成本/速度权衡
# 通常:512MB 是成本和延迟之间的最佳平衡点

Lambda URL(直接 HTTPS 端点)
// CDK:创建带有 Function URL 的 Lambda
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as lambdaNodejs from 'aws-cdk-lib/aws-lambda-nodejs';
const fn = new lambdaNodejs.NodejsFunction(this, 'ApiFunction', {
entry: 'src/handler.ts',
handler: 'handler',
runtime: lambda.Runtime.NODEJS_20_X,
environment: {
TABLE_NAME: table.tableName,
},
});
// 添加 Function URL
const fnUrl = fn.addFunctionUrl({
authType: lambda.FunctionUrlAuthType.NONE,
cors: {
allowedOrigins: ['https://myapp.com'],
allowedMethods: [lambda.HttpMethod.ALL],
allowedHeaders: ['*'],
},
});
// Handler
export async function handler(event: any) {
const method = event.requestContext.http.method;
const path = event.rawPath;
return {
statusCode: 200,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ path, method }),
};
}
事件源映射:SQS
// 批量处理 SQS 消息
export async function sqsHandler(event: SQSEvent): Promise<SQSBatchResponse> {
const failures: SQSBatchItemFailure[] = [];
await Promise.all(
event.Records.map(async (record) => {
try {
const body = JSON.parse(record.body);
await processMessage(body);
} catch (error) {
console.error(`Failed: ${record.messageId}`, error);
failures.push({ itemIdentifier: record.messageId });
}
})
);
// 返回部分失败 - 仅失败的消息重新排队
return { batchItemFailures: failures };
}
// SQS 触发器的 Lambda 配置
// BatchSize: 10
// MaximumBatchingWindowInSeconds: 30
// FunctionResponseTypes: ReportBatchItemFailures
死信队列模式
Resources:
ProcessFunction:
Type: AWS::Lambda::Function
Properties:
DeadLetterConfig:
TargetArn: !GetAtt DLQ.Arn
DLQ:
Type: AWS::SQS::Queue
Properties:
QueueName: process-dlq
MessageRetentionPeriod: 1209600 # 14 天
DLQAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
MetricName: ApproximateNumberOfMessagesVisible
Namespace: AWS/SQS
Dimensions:
- Name: QueueName
Value: process-dlq
Threshold: 1
ComparisonOperator: GreaterThanOrEqualToThreshold
AlarmActions:
- !Ref AlertTopic
总结
Lambda 优化策略:
- 冷启动:在 handler 外部初始化,Java 使用 SnapStart
- 内存:使用性能调优找到最佳内存设置
- 层:跨函数共享代码/依赖
- 预置并发:为延迟敏感的 API 预预热
- SQS:使用批量项目失败报告实现可靠处理
- DLQ:始终配置死信队列以处理错误