如何实现S3新文件自动下载到EC2?Lambda+SSM方案报错排查
方案选择建议
对于你的场景(高频上传、低延迟要求、EC2常驻处理),最简单、延迟最低的方案是 S3事件触发 + SQS标准队列 + EC2常驻消费进程,比你当前使用的Lambda+SSM方案稳定性高、延迟更低,并发场景下也不会受SSM配额限制。
S3上传新文件后会直接推送事件到SQS队列,EC2上只需要跑一个简单的常驻脚本轮询队列,收到事件就直接下载S3文件处理,端到端延迟可以控制在百毫秒级,也不会出现事件丢失的问题。
第一个问题:Lambda超时原因
你遇到的3秒超时问题是两个原因共同导致的:
- Lambda默认超时时间为3秒,你的代码中调用
ssm.send_command后还要等待3秒再调用ssm.get_command_invocation,整体执行时间已经超过默认的超时阈值。 - Lambda执行角色缺少SSM相关权限(
ssm:SendCommand、ssm:GetCommandInvocation)时,SSM API调用会卡住直到超时,你删除SSM相关代码后函数正常运行,也验证了问题出在SSM调用环节。
修复方式:
- 把Lambda的超时时间调整到15秒以上
- 给Lambda执行角色添加SSM相关操作权限
第二个问题:SSM命令执行后找不到文件原因
代码运行正常但EC2上找不到hi.txt,是SSM执行的默认配置导致的:
- SSM Agent执行
AWS-RunShellScript文档时,默认运行用户是root,默认工作目录为/root/,你生成的hi.txt实际存放在root用户的主目录下,而非你登录时用的普通用户(ec2-user/ubuntu等)的主目录。 - 如果你需要把文件生成到指定普通用户的主目录,要写绝对路径,比如要写到ec2-user的主目录,命令要写成
touch /home/ec2-user/hi.txt,或者切换用户执行:runuser -l ec2-user -c 'touch hi.txt'。
另外还要确认EC2实例满足SSM运行的前提条件:
- EC2实例已经安装SSM Agent
- EC2实例绑定的IAM角色包含
AmazonSSMManagedInstanceCore权限 - EC2和SSM服务网络连通(有公网IP,或者VPC内配置了SSM接口端点)
- 你之前写的S3下载命令存在错误,漏了S3路径前缀和桶名,正确的写法应该是
aws s3 cp s3://{bucketname}/{filename} 目标路径,否则就算命令执行也会下载失败。
优化建议
如果继续使用Lambda+SSM方案,需要做以下修改:
- 调整Lambda超时时间为10~30秒,内存调到256MB加快执行速度
- 补全S3下载命令的桶名和S3协议前缀
- SSM命令中所有路径写绝对路径,避免默认工作目录不符的问题
- 确认EC2实例满足SSM运行的所有前提条件
如果切换到SQS方案,会省去SSM的各种配置成本,也不会有Lambda冷启动、调用配额的问题,更适合高频上传的场景。
内容的提问来源于stack exchange,提问作者Akshay Acharya
相关产品推荐
相关产品推荐

