关于 lambda
面向管理 AWS Lambda 函数的开发者参考技能,汇集核心概念、AWS CLI 与 boto3 示例,以及运维建议和故障排查。
主要功能
- 01创建和调用函数
- 02配置 S3 与 SQS 事件集成
- 03管理层和环境配置
- 04性能、安全与成本建议
- 05CLI 命令及故障排查
适用场景
- 01创建并调用 Lambda 函数
- 02将 S3 或 SQS 事件连接到函数
- 03排查超时、内存或权限错误
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ itsmostafa/ aws-agent-skills --skill lambda安装后在 Claude Code 中输入/lambda确认已加载。
附带文件debugging.mddeployment.md
详细介绍
AWS Lambda
AWS Lambda 无需配置服务器即可运行代码。您只需为实际消耗的计算时间付费。Lambda 可自动扩展,每天处理几次请求,也能扩展到每秒数千次请求。
目录
核心概念
函数
将代码与配置打包在一起。包含运行时、处理程序、内存、超时和 IAM 角色。
调用类型
| 类型 | 描述 | 用例 |
|---|---|---|
| 同步 | 调用方等待响应 | API Gateway、直接调用 |
| 异步 | 发起后不等待结果 | S3、SNS、EventBridge |
| 基于轮询 | Lambda 轮询来源 | SQS、Kinesis、DynamoDB Streams |
执行环境
Lambda 会创建执行环境来运行函数。组成部分:
- 冷启动:初始化新环境
- 热启动:复用现有环境
- 处理程序:入口函数
- 上下文:运行时信息
层
可复用的库、依赖项或自定义运行时包(每个函数最多 5 个)。
常见模式
创建 Python 函数
AWS CLI:
# Create deployment package
zip function.zip lambda_function.py
# Create function
aws lambda create-function \
--function-name MyFunction \
--runtime python3.12 \
--role arn:aws:iam::123456789012:role/lambda-role \
--handler lambda_function.handler \
--zip-file fileb://function.zip \
--timeout 30 \
--memory-size 256
# Update function code
aws lambda update-function-code \
--function-name MyFunction \
--zip-file fileb://function.zip
boto3:
import boto3
import zipfile
import io
lambda_client = boto3.client('lambda')
# Create zip in memory
zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, 'w') as zf:
zf.writestr('lambda_function.py', '''
def handler(event, context):
return {"statusCode": 200, "body": "Hello"}
''')
zip_buffer.seek(0)
# Create function
lambda_client.create_function(
FunctionName='MyFunction',
Runtime='python3.12',
Role='arn:aws:iam::123456789012:role/lambda-role',
Handler='lambda_function.handler',
Code={'ZipFile': zip_buffer.read()},
Timeout=30,
MemorySize=256
)
添加 S3 触发器
# Add permission for S3 to invoke Lambda
aws lambda add-permission \
--function-name MyFunction \
--statement-id s3-trigger \
--action lambda:InvokeFunction \
--principal s3.amazonaws.com \
--source-arn arn:aws:s3:::my-bucket \
--source-account 123456789012
# Configure S3 notification (see S3 skill)
添加 SQS 事件源
aws lambda create-event-source-mapping \
--function-name MyFunction \
--event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
--batch-size 10 \
--maximum-batching-window-in-seconds 5
环境变量
aws lambda update-function-configuration \
--function-name MyFunction \
--environment "Variables={DB_HOST=mydb.cluster-xyz.us-east-1.rds.amazonaws.com,LOG_LEVEL=INFO}"
创建并附加层
# Create layer
zip -r layer.zip python/
aws lambda publish-layer-version \
--layer-name my-dependencies \
--compatible-runtimes python3.12 \
--zip-file fileb://layer.zip
# Attach to function
aws lambda update-function-configuration \
--function-name MyFunction \
--layers arn:aws:lambda:us-east-1:123456789012:layer:my-dependencies:1
调用函数
# Synchronous invoke
aws lambda invoke \
--function-name MyFunction \
--payload '{"key": "value"}' \
response.json
# Asynchronous invoke
aws lambda invoke \
--function-name MyFunction \
--invocation-type Event \
--payload '{"key": "value"}' \
response.json
CLI 参考
函数管理
| 命令 | 描述 |
|---|---|
aws lambda create-function | 创建新函数 |
aws lambda update-function-code | 更新函数代码 |
aws lambda update-function-configuration | 更新设置 |
aws lambda delete-function | 删除函数 |
aws lambda list-functions | 列出所有函数 |
aws lambda get-function | 获取函数详情 |
调用
| 命令 | 描述 |
|---|---|
aws lambda invoke | 调用函数 |
aws lambda invoke-async | 异步调用(已弃用) |
事件源
| 命令 | 描述 |
|---|---|
aws lambda create-event-source-mapping | 添加事件源 |
aws lambda list-event-source-mappings | 列出映射 |
aws lambda update-event-source-mapping | 更新映射 |
aws lambda delete-event-source-mapping | 移除映射 |
权限
| 命令 | 描述 |
|---|---|
aws lambda add-permission | 添加基于资源的策略 |
aws lambda remove-permission | 移除权限 |
aws lambda get-policy | 查看资源策略 |
最佳实践
性能
- 合理设置内存:更多内存 = 更多 CPU = 更快执行
- 尽量减少冷启动:保持函数预热,使用 Provisioned Concurrency
- 优化包大小:较小的包部署速度更快
- 使用层存放共享依赖项
- 在处理程序外初始化:在多次调用间复用连接
# GOOD: Initialize outside handler
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('MyTable')
def handler(event, context):
# Reuses existing connection
return table.get_item(Key={'id': event['id']})
安全
- IAM 角色遵循最小权限原则 — 仅授予所需权限
- 使用 Secrets Manager 存储敏感数据
- 仅在需要时启用 VPC(会增加延迟)
- 使用 KMS 加密环境变量
成本优化
- 设置合适的超时时间 — 不要在没有必要时使用最长的 15 分钟
- 使用 ARM 架构(Graviton2),获得更优的性价比,提升幅度达 34%
- 尽可能批量处理
- 使用 Reserved Concurrency 限制成本
可靠性
- 为异步调用配置 DLQ
- 处理重试 — 异步事件会重试两次
- 确保处理程序具备幂等性
- 使用结构化日志记录
故障排除
超时错误
症状: Task timed out after X seconds
原因:
- 函数运行时间超过超时时间
- 网络调用无法访问的资源
- VPC 配置问题
调试:
# Check function configuration
aws lambda get-function-configuration \
--function-name MyFunction \
--query "Timeout"
# Increase timeout
aws lambda update-function-configuration \
--function-name MyFunction \
--timeout 60
内存不足
症状: 函数因内存错误而崩溃
修复:
aws lambda update-function-configuration \
--function-name MyFunction \
--memory-size 512
冷启动延迟
原因:
- 部署包较大
- VPC 配置
- 需要加载大量依赖项
解决方案:
- 使用预置并发
- 减小包大小
- 使用层来管理依赖项
- 考虑使用 Graviton2(ARM)
# Enable Provisioned Concurrency
aws lambda put-provisioned-concurrency-config \
--function-name MyFunction \
--qualifier LIVE \
--provisioned-concurrent-executions 5
权限被拒绝
症状: AccessDeniedException
调试:
# Check execution role
aws lambda get-function-configuration \
--function-name MyFunction \
--query "Role"
# Check role policies
aws iam list-attached-role-policies \
--role-name lambda-role
VPC 连接问题
症状: 无法访问互联网或 AWS 服务
原因:
- 没有用于访问互联网的 NAT Gateway
- 缺少用于 AWS 服务的 VPC endpoint
- 安全组阻止了出站流量
解决方案:
- 添加 NAT Gateway 以访问互联网
- 添加用于 AWS 服务的 VPC endpoint
- 检查安全组规则
参考资料
评论
支持 Markdown