☰
【研发类-后端开发Skills】aws-serverless 技能
2026/10/1 17:07:10 网站建设 项目流程

专门用于在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.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 # 测试事件

最佳实践

  1. 客户端初始化:在处理器外部初始化客户端(在温调用之间重用)
  2. 响应格式:始终返回正确的API Gateway响应格式
  3. 结构化日志:使用结构化JSON日志以便CloudWatch Insights查询
  4. 请求追踪:在错误日志中包含请求ID以便追踪
  5. 错误处理:实现全面的错误处理和异常捕获
  6. 环境变量:使用环境变量管理配置,避免硬编码

SAM模板示例

HTTP API与Lambda集成

# template.yaml (SAM)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
Function:
Runtime: nodejs20.x
Timeout: 30
MemorySize: 256
Environment:
Variables:
TABLE_NAME: !Ref ItemsTable

Resources:
# 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:为延迟敏感的应用配置预置并发

使用限制

  • 仅当任务明确符合上述范围时使用此技能
  • 不要将输出视为环境特定验证、测试或专家审查的替代品
  • 如果缺少所需的输入、权限、安全边界或成功标准,请停止并要求澄清

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询