迁移到新服务器后AWS S3 getIterator调用ListObjects接口出现错误
问题核心结论
S3存储桶本身不存在域名维度的访问限制,但支持IP维度的访问控制,你遇到的问题大概率是IP变更触发了权限拦截,按以下步骤定位即可:
- 第一步:捕获S3调用的具体错误信息
你当前只捕获了S3Client实例化阶段的异常,没有捕获ListObjects接口调用的异常,先修改代码打印完整报错:
try { $objects = $s3->getIterator('ListObjects', array('Bucket' => $bucketName)); } catch (Aws\S3\Exception\S3Exception $e) { die("S3调用错误: " . $e->getMessage()); } catch (Exception $e) { die("通用错误: " . $e->getMessage()); }
如果返回403 Forbidden错误,继续往下排查;如果返回网络超时类错误,检查新服务器安全组出站规则、NAT配置是否允许访问us-west-2区域的S3服务地址。
第二步:检查S3桶策略配置
登录AWS控制台进入对应存储桶的「权限」-「存储桶策略」页面,查找是否存在包含aws:SourceIp条件的规则,确认规则中的IP白名单是否包含新服务器的公网出口IP。
此外如果你的S3桶配置了仅允许VPC内部访问,还要检查是否存在aws:SourceVpc、aws:SourceVpce类条件,确认新服务器是否在允许的VPC范围内、是否关联了有权限的VPC端点。第三步:检查访问密钥对应的IAM用户权限
你这段代码使用硬编码的AKSK进行鉴权,不是IAM角色,所以要检查该AKSK对应的IAM用户的权限策略,是否配置了aws:SourceIp的访问条件,限制了仅允许特定IP调用AWS服务,很多老旧的安全配置会在IAM用户侧加IP限制,容易被遗漏。第四步:验证服务器时间同步状态
AWS API请求的签名对时间敏感度极高,如果新服务器的系统时间与标准时间误差超过15分钟,会直接导致签名校验失败返回403,检查服务器是否开启NTP时间同步,确认系统时间准确。
补充说明:新服务器的子域名访问配置和S3调用完全无关,S3侧不会感知到你服务器的web访问域名,不需要在这个方向浪费时间排查。
内容的提问来源于stack exchange,提问作者Cesar Bielich

