AWS实战:S3与Lambda集成指南

一、核心概念
  1. S3存储桶
    AWS对象存储服务,用于存储任意类型数据(图片、日志、视频等)
  2. Lambda函数
    无服务器计算服务,事件触发执行代码
  3. 集成原理
    S3事件(如文件上传/删除)自动触发Lambda函数执行,典型应用场景:
    • 实时图片压缩
    • 日志文件分析
    • 数据备份与同步
二、实战步骤
1. 创建S3存储桶
aws s3api create-bucket --bucket my-unique-bucket-name --region us-east-1

2. 编写Lambda函数(Python示例)
import boto3

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    # 获取触发事件的文件信息
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key'] 
    
    # 示例:打印新上传文件信息
    print(f"新文件上传至 {bucket}/{key}")
    
    # 实际业务逻辑(如图片处理/数据分析)
    # process_file(bucket, key)
    
    return {'statusCode': 200}

3. 配置事件触发
  1. 在Lambda控制台创建新函数
  2. 添加S3触发器:
    • 选择目标存储桶
    • 设置事件类型(如s3:ObjectCreated:*
    • 配置前缀/后缀过滤(可选)
4. 权限配置(关键!)
// IAM角色策略示例
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "logs:CreateLogGroup"
      ],
      "Resource": "*"
    }
  ]
}

三、典型应用场景
  1. 自动缩略图生成

    from PIL import Image
    import io
    
    def process_image(bucket, key):
        s3.download_file(bucket, key, '/tmp/original.jpg')
        img = Image.open('/tmp/original.jpg')
        img.thumbnail((200, 200))
        img.save('/tmp/thumbnail.jpg')
        s3.upload_file('/tmp/thumbnail.jpg', bucket, f"thumbnails/{key}")
    

  2. CSV文件实时处理

    import pandas as pd
    
    def process_csv(bucket, key):
        csv_obj = s3.get_object(Bucket=bucket, Key=key)
        df = pd.read_csv(csv_obj['Body'])
        # 执行数据分析
        results = df.groupby('category').sum()
        results.to_csv('/tmp/results.csv')
        s3.upload_file('/tmp/results.csv', 'results-bucket', key)
    

四、优化建议
  1. 错误处理
    添加SQS死信队列捕获失败事件
  2. 性能优化
    • 设置适当内存(建议≥512MB)
    • 启用Lambda Provisioned Concurrency
  3. 成本控制
    • 使用S3生命周期策略自动清理处理过的文件
    • 设置Lambda执行超时阈值(默认15秒)
五、调试技巧
  1. 使用CloudWatch查看日志:
    aws logs tail /aws/lambda/your-function-name --follow
    

  2. 本地测试事件模板:
    {
      "Records": [
        {
          "s3": {
            "bucket": {"name": "your-bucket"},
            "object": {"key": "test-file.jpg"}
          }
        }
      ]
    }
    

提示:首次部署建议使用AWS控制台操作,熟悉流程后可转为Terraform/CloudFormation自动化部署。

更多推荐