如何通过Serverless Framework实现跨账号S3 Put事件触发Lambda
跨账号S3 Put事件触发Lambda的Serverless Framework实现方案
核心逻辑和控制台手动配置的权限要求完全一致,只是把手动点选的步骤转成基础设施即代码配置,注意跨账号场景下不要直接用Serverless Framework默认的同账号S3事件绑定语法,会因为权限边界报错,按以下步骤配置即可:
前置说明
先明确两个账号的资源边界,避免配置混淆:
- 资源账号(记为账号A):持有目标S3存储桶,负责配置桶的事件通知规则
- 计算账号(记为账号B):部署Lambda函数,负责接收S3事件执行业务逻辑
- 所有跨账号关联的资源必须部署在同一个AWS区域,跨区域S3事件触发Lambda官方不支持
步骤1:编写账号B侧的Lambda部署配置
在账号B的Serverless项目下编写serverless.yml,注意不要在functions块下直接写s3事件绑定跨账号桶——默认的绑定逻辑会尝试直接修改跨账号桶配置,必然因为权限不足失败。
service: cross-account-s3-processor frameworkVersion: '3' provider: name: aws runtime: nodejs18.x # 替换成你实际用的运行时 region: ap-southeast-1 # 替换成你的目标区域 iam: role: statements: # 给Lambda执行角色加S3对象读权限,按需补充 - Effect: Allow Action: - s3:GetObject Resource: arn:aws:s3:::YOUR-ACCOUNT-A-BUCKET/* # 如果桶用了KMS加密,还要加对应KMS密钥的解密权限 # - Effect: Allow # Action: kms:Decrypt # Resource: 你的KMS密钥ARN functions: s3PutHandler: handler: index.handler # 替换成你的实际处理函数入口 resources: Resources: # 给Lambda加跨账号调用权限,允许账号A的指定S3桶触发 CrossAccountLambdaInvokePermission: Type: AWS::Lambda::Permission Properties: FunctionName: !GetAtt S3PutHandlerLambdaFunction.Arn Action: lambda:InvokeFunction Principal: s3.amazonaws.com SourceArn: arn:aws:s3:::YOUR-ACCOUNT-A-BUCKET # 替换成账号A的目标桶ARN SourceAccount: '123456789012' # 替换成账号A的12位账号ID,必须加,避免权限过宽
用账号B的凭证执行sls deploy,部署完成后记录输出的Lambda函数ARN,后续配置要用到。
步骤2:编写账号A侧的S3桶事件配置
因为S3桶属于账号A,必须用账号A的凭证修改桶的事件通知规则,你可以单独建一个轻量Serverless项目做这件事,serverless.yml配置如下:
service: s3-bucket-event-setup frameworkVersion: '3' provider: name: aws region: ap-southeast-1 # 和Lambda所在区域保持一致 resources: Resources: TargetBucketNotification: Type: AWS::S3::Bucket Properties: BucketName: YOUR-ACCOUNT-A-BUCKET # 替换成账号A下的现有桶名 NotificationConfiguration: LambdaConfigurations: - Event: s3:ObjectCreated:Put # 精准匹配Put对象操作,需要覆盖所有上传行为可以换成s3:ObjectCreated:* Function: arn:aws:lambda:ap-southeast-1:234567890123:function:cross-account-s3-processor-dev-s3PutHandler # 替换成步骤1部署得到的Lambda ARN # 可选:按对象前缀/后缀过滤触发规则 # Filter: # S3Key: # Rules: # - Name: prefix # Value: upload/ # - Name: suffix # Value: .png
用账号A的凭证执行sls deploy即可完成全部配置。
常见踩坑点
- 权限必须双向配置:只配Lambda侧调用权限、不配S3桶通知,或者反过来,都会导致触发失败
- Lambda权限块里的
SourceAccount字段不要省略,否则任意账号的S3桶只要知道你的Lambda ARN都能触发函数,存在安全风险 - 如果桶开启了SSE-KMS加密,除了给Lambda执行角色加KMS解密权限,还要确认KMS密钥策略允许账号B的Lambda角色访问密钥
- 部署顺序不要搞反:先部署账号B的Lambda拿到有效ARN,再部署账号A的桶通知配置,否则会报目标Lambda不存在的错误
内容的提问来源于stack exchange,提问作者Tushar Jadhav
相关产品推荐
相关产品推荐

