如何为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
相关产品推荐
相关产品推荐

