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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:27:38