EC2型ECS中Python任务连接S3超时,排查网络配置遗漏点
问题描述
我有一个运行在EC2(非Fargate)上的Python ECS任务,在该任务中通过以下代码创建boto3客户端:
cls._instance.client = boto3.client( "s3", region_name="eu-west-1", )
尝试执行PutObject操作(调用client.upload_file_obj或client.put_object)。部署到ECS并访问端点后,请求出现超时(或内存泄漏),日志显示:
[2023-09-13 12:37:22 +0000] [1] [ERROR] Worker (pid:40) was sent SIGKILL! Perhaps out of memory? 2023-09-13 12:37:21 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:40)
我的ECS任务具备目标S3桶的PutObject权限,ECS安全组已放行443和80端口的出站流量,且已为所有子网创建VPC端点,但仍无法解决超时问题。我的任务无公网IP,由应用负载均衡(ALB)进行负载分发,请问网络配置中可能遗漏了什么?
可能的网络配置遗漏点
- VPC端点类型错误:S3仅支持网关型VPC端点,如果创建的是接口型端点,完全无法用于S3访问。同时要确认网关端点已关联ECS任务所在子网的路由表,且路由表中添加了指向S3前缀列表(pl-xxxxxx)的路由,目标为该网关端点。
- VPC端点策略限制:即便任务有IAM权限,VPC端点自身的策略可能拒绝PutObject操作。检查端点策略,确保允许对目标桶执行
s3:PutObject动作,资源范围覆盖目标桶及对象(arn:aws:s3:::your-bucket/*)。 - 子网路由表冲突:如果ECS任务所在子网的路由表存在默认路由指向NAT网关,但任务无公网IP,NAT网关无法完成源地址转换,会导致S3流量无法正常转发。此时需确保S3前缀列表的路由优先级高于默认路由,或移除无效的默认路由(依赖VPC端点访问S3时)。
- 网络ACL限制:任务所在子网的网络ACL需允许出站TCP 443流量到S3的前缀列表范围,同时网关端点关联的网络ACL要允许S3相关的入站、出站流量。安全组针对网关型端点无需额外配置,但网络ACL的规则容易被忽略。
- VPC DNS配置缺失:boto3依赖DNS解析来指向VPC端点,需确保VPC开启了
enableDnsSupport和enableDnsHostnames属性。如果DNS配置未开启,boto3会尝试通过公网访问S3,而任务无公网IP导致超时。 - 内存不足的副作用:日志明确提示可能内存不足,需确认ECS任务的内存配额是否足够处理上传文件。若上传大文件,Python进程内存占用过高会被系统杀死,表现为超时。可调整任务内存配额,或改用分块上传(如
boto3.s3.transfer.TransferManager)降低内存消耗。
内容的提问来源于stack exchange,提问作者Simeon Borisov
相关产品推荐
相关产品推荐

