mcpField
L
lambda

lambda

github.com/itsmostafa云与 DevOps1.2k176 次安装2 天前更新
代码仓库

关于 lambda

面向管理 AWS Lambda 函数的开发者参考技能,汇集核心概念、AWS CLI 与 boto3 示例,以及运维建议和故障排查。

主要功能

  1. 01创建和调用函数
  2. 02配置 S3 与 SQS 事件集成
  3. 03管理层和环境配置
  4. 04性能、安全与成本建议
  5. 05CLI 命令及故障排查

适用场景

  1. 01创建并调用 Lambda 函数
  2. 02将 S3 或 SQS 事件连接到函数
  3. 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