如何配置AWS Transfer Family,按S3桶触发指定Lambda函数(无需中间Lambda)
解决AWS Transfer Family分桶触发对应Lambda函数的纯配置方案
核心思路
通过为每个S3桶创建专属工作流,搭配条件判断和权限隔离,实现上传到不同桶的文件自动触发对应Lambda函数,全程无需中间函数或额外编码。
具体步骤
1. 给Lambda函数配置Transfer调用权限
为每个目标Lambda函数(b1、b2)添加资源策略,允许AWS Transfer Family服务调用它们:
- 打开Lambda控制台,进入b1函数页面,切换到配置>权限>资源策略,添加以下策略(替换占位符为你的实际信息):
{ "Version": "2012-10-17", "Id": "transfer-invoke-b1", "Statement": [ { "Sid": "AllowTransferService", "Effect": "Allow", "Principal": { "Service": "transfer.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:你的区域:你的账户ID:function:b1", "Condition": { "StringEquals": { "aws:SourceAccount": "你的账户ID" }, "ArnLike": { "aws:SourceArn": "arn:aws:transfer:你的区域:你的账户ID:server/你的Transfer服务器ID" } } } ] }
- 对b2函数执行相同操作,替换函数名和对应ARN即可。
2. 创建分桶专属工作流
为每个S3桶创建独立的Transfer工作流,绑定对应Lambda并设置触发条件:
工作流1(对应bucket1 + b1)
- 进入AWS Transfer Family控制台,选择工作流>创建工作流。
- 添加Invoke Lambda动作:
- 选择Lambda函数b1。
- 设置条件表达式:
${transfer:bucket} == "bucket1"(只有上传到bucket1的文件才会触发此动作)。
- 配置工作流的IAM角色:
- 创建或选择一个IAM角色,添加以下权限策略,限定仅能访问bucket1和调用b1:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:::bucket1/*" }, { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:你的区域:你的账户ID:function:b1" } ] }
- 创建或选择一个IAM角色,添加以下权限策略,限定仅能访问bucket1和调用b1:
- 完成工作流创建,命名为
workflow-bucket1-b1。
工作流2(对应bucket2 + b2)
重复上述步骤,将Lambda函数改为b2,条件表达式改为${transfer:bucket} == "bucket2",IAM角色权限限定为bucket2和b2,命名为workflow-bucket2-b2。
3. 关联工作流到Transfer服务器
- 进入Transfer服务器的配置页面,切换到工作流标签。
- 点击添加工作流,依次添加刚创建的两个工作流。
- 保存配置后,当文件上传到bucket1时,会触发
workflow-bucket1-b1调用b1;上传到bucket2时触发workflow-bucket2-b2调用b2。
备选方案(按用户分桶)
如果你的业务是不同用户对应不同S3桶,可以直接给每个Transfer用户关联专属工作流:
- 进入用户配置页面,在工作流中选择对应桶的工作流(比如用户A关联
workflow-bucket1-b1),无需设置条件表达式,更直接高效。
内容的提问来源于stack exchange,提问作者Pablo Leal
相关产品推荐
相关产品推荐

