Windows下R语言paws访问S3超时但AWS CLI正常问题咨询
问题描述
在Windows设备上使用R语言paws库访问S3存储桶时,执行如下代码触发超时:
svc <- paws::s3(config = list(credentials = list(profile="my_profile"), region="us-east-1")) svc$list_objects(Bucket="my-bucket")
报错信息如下:
Error in curl::curl_fetch_memory(url, handle = handle): Timeout was reached: [my-bucket.s3amazonaws.com] Operation timed out after 10003 milliseconds with 0 out of 0 bytes received.
相同配置下AWS CLI可正常访问目标存储桶,执行命令:
aws --profile=my_profile s3 ls s3://my-bucket
尝试通过设置MaxKeys参数限制返回键数量未解决问题,对应代码:
svc$list_objects(Bucket="my-bucket", MaxKeys=10)
根因分析
- 核心诱因是端点拼接错误:从报错信息可见,paws生成的请求地址为
my-bucket.s3amazonaws.com,域名缺失s3与amazonaws.com之间的分隔符,属于paws在部分Windows环境下的已知端点生成bug,请求被发送到不存在的无效域名,自然触发超时。AWS CLI的端点生成逻辑无该问题,因此可以正常访问。 - 网络配置不匹配:paws底层依赖curl发起请求,默认不会自动继承AWS CLI配置的代理规则、也不会自动读取系统代理配置,在需要代理访问公网的企业内网环境下,会出现CLI可通、curl请求不通的情况。
- 默认超时阈值过短:paws默认请求超时仅10000毫秒(10秒),部分网络环境下TLS握手、鉴权流程耗时超过该阈值就会触发超时,该问题和接口返回的对象数量无关,因此设置
MaxKeys参数不会生效。
解决方案
按优先级依次尝试以下操作:
- 手动指定正确的S3服务端点,跳过自动拼接逻辑,从根源避免域名生成错误
svc <- paws::s3( config = list( credentials = list(profile="my_profile"), region = "us-east-1", endpoint = "https://s3.us-east-1.amazonaws.com" ) ) # 测试接口调用 svc$list_objects(Bucket="my-bucket", MaxKeys=10)
- 对齐网络配置,调整超时阈值
如果处于需要代理的网络环境,先查询AWS CLI生效的代理配置(执行aws configure get proxy可查看,无返回结果说明不需要配置代理),初始化客户端时传入代理参数,同时将超时时间调整为60秒,覆盖默认的10秒阈值:
svc <- paws::s3( config = list( credentials = list(profile="my_profile"), region = "us-east-1", endpoint = "https://s3.us-east-1.amazonaws.com", timeout = 60, proxy = "http://实际代理地址:端口" # 无代理可删除该行 ) )
- 强制使用路径风格寻址
如果存储桶名称存在特殊字符、或者所在区域对虚拟托管风格寻址支持有限,可开启路径风格访问开关,避免寻址异常:
svc <- paws::s3( config = list( credentials = list(profile="my_profile"), region = "us-east-1", endpoint = "https://s3.us-east-1.amazonaws.com", timeout = 60, s3_force_path_style = TRUE ) )
完成配置后再调用list_objects接口即可正常返回结果,无需额外调整MaxKeys参数。
内容的提问来源于stack exchange,提问作者Ramón J Romero y Vigil
相关产品推荐
相关产品推荐

