AWS Transfer Family SFTP服务器Lambda认证调用失败问题求助
解决AWS Transfer Family调用Lambda身份认证失败的问题
1. 修正Lambda ARN的空格问题
错误信息里的Lambda ARN存在明显问题:arn:aws:lambda:us-east-2: 123456789012:function:SFTP-Lambda,账号ID前多了一个空格。这会导致Transfer Family无法正确定位到目标Lambda函数,需立即修正Transfer服务器配置中指定的Lambda ARN,确保无多余空格、拼写完全正确。
2. 修复Lambda资源策略格式错误
当前提供的资源策略存在语法错误(末尾多了一个闭合括号),修正后的正确策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "transfer.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:SFTP-Lambda", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:transfer:us-east-2:123456789012:server/s-123456" } } } ] }
同时确认策略中AWS:SourceArn的值与Transfer服务器ARN完全匹配,无任何拼写错误。
3. 检查Lambda执行角色权限
Lambda函数的执行角色需具备完成身份认证逻辑的必要权限:
- 至少附加
AWSLambdaBasicExecutionRole托管权限,确保函数能生成CloudWatch日志,方便后续排查问题; - 如果你的认证逻辑需要查询数据库、读取S3对象等操作,需给执行角色添加对应的权限策略。
4. 确保Lambda返回符合要求的响应格式
Transfer Family对身份认证Lambda的返回格式有严格要求,必须返回包含以下核心字段的JSON:
{ "Role": "arn:aws:iam::123456789012:role/transfer-sftp-access-role", "HomeDirectory": "/your-s3-bucket/${transfer:UserName}", "HomeDirectoryType": "LOGICAL", "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":\"s3:ListBucket\",\"Resource\":\"arn:aws:s3:::your-s3-bucket\",\"Condition\":{\"StringLike\":{\"s3:prefix\":\"${transfer:UserName}/*\"}}},{\"Effect\":\"Allow\",\"Action\":[\"s3:GetObject\",\"s3:PutObject\"],\"Resource\":\"arn:aws:s3:::your-s3-bucket/${transfer:UserName}/*\"}]}" }
若返回格式不符合要求,会直接导致认证失败,建议通过CloudWatch日志查看Lambda执行时的输出内容。
5. 手动验证Lambda函数可用性
构造模拟的Transfer认证事件,手动测试Lambda函数执行情况,示例事件如下:
{ "serverId": "s-123456", "username": "user", "password": "test-password", "protocol": "SFTP", "sourceIp": "172.105.39.41" }
确认函数能正常执行、无报错,并返回符合要求的响应内容。
内容的提问来源于stack exchange,提问作者shiv
相关产品推荐
相关产品推荐

