You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为CloudFormation部署的无服务器Lambda添加S3对象通知触发器(手动桶)

问题解答

1. 是否可为Lambda添加S3对象通知触发器?

完全可以。即使S3桶是手动创建且无法修改,只要你拥有该桶的s3:PutBucketNotification配置权限,就能为其绑定Lambda触发器。

2. 如何设置特定前缀/文件夹、后缀的触发规则?

可以通过两种CloudFormation方式实现,同时需配置必要的权限:

方式一:使用AWS::S3::BucketNotification资源

在模板中新增该资源,指定目标桶并配置过滤规则:

Resources:
  # 新增S3桶通知配置
  MyS3BucketNotification:
    Type: AWS::S3::BucketNotification
    Properties:
      Bucket: 你的手动创建桶名称 # 也可使用ARN格式:!Sub "arn:aws:s3:::${桶名称}"
      NotificationConfiguration:
        LambdaConfigurations:
          - Event: s3:ObjectCreated:*
            Function: !GetAtt MyLambdaFunction.Arn
            Filter:
              S3Key:
                Rules:
                  - Name: prefix
                    Value: "data/upload/" # 匹配特定前缀(模拟文件夹)
                  - Name: suffix
                    Value: ".json" # 匹配特定文件后缀

方式二:利用Serverless Transform的Events定义

直接在Lambda资源中配置S3事件,写法更简洁:

Resources:
  MyLambdaFunction:
    Type: AWS::Serverless::Function # 改用Serverless函数类型
    Properties:
      Role: !GetAtt LambdaRole.Arn
      Runtime: python3.9
      Handler: index.lambda_handler
      Code:
        ... # 你的代码配置
      Tags:
        - Key: Lambda
          Value: MyLambdaFunction
      Events:
        S3Trigger:
          Type: S3
          Properties:
            Bucket: 你的手动创建桶名称 # 或ARN
            Events: s3:ObjectCreated:*
            Filter:
              S3Key:
                Rules:
                  - Name: prefix
                    Value: "data/upload/"
                  - Name: suffix
                    Value: ".json"

必加权限配置:需要给S3桶授予调用Lambda的权限,新增以下资源:

LambdaInvokePermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt MyLambdaFunction.Arn
      Action: lambda:InvokeFunction
      Principal: s3.amazonaws.com
      SourceArn: !Sub "arn:aws:s3:::${你的手动创建桶名称}"

3. 是否需要S3桶名称或ARN?

是的,必须提供目标S3桶的名称或ARN,CloudFormation需要明确指定要配置通知规则的桶。

现有模板的关键修正

你的Lambda角色信任策略中的主体错误设置为ec2.amazonaws.com,Lambda函数的信任主体应为lambda.amazonaws.com,同时建议缩小权限范围:

LambdaRole:
  Type: 'AWS::IAM::Role'
  Properties:
    AssumeRolePolicyDocument:
      Version: "2012-10-17"
      Statement:
        - Effect: Allow
          Principal:
            Service:
              - lambda.amazonaws.com # 替换原ec2.amazonaws.com
          Action:
            - 'sts:AssumeRole'
    Path: /
    Policies:
      - PolicyName: LambdaS3AccessPolicy
        PolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Action:
                - 's3:GetObject' # 避免使用s3:*,最小化权限
              Resource: !Sub "arn:aws:s3:::${你的手动创建桶名称}/*"
            - Effect: Allow
              Action:
                - 'logs:CreateLogGroup'
                - 'logs:CreateLogStream'
                - 'logs:PutLogEvents'
              Resource: '*' # Lambda运行必需的日志权限

内容的提问来源于stack exchange,提问作者haju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:16:00