You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS PHP SDK V3删除S3对象的问题排查与解决

使用AWS PHP SDK v3删除S3对象的踩坑记录与解决方法

初始问题

最开始我写了这样的代码来删除S3对象:

require 'aws-autoloader.php';
$client = new Aws\S3\S3Client([
    'version' => 'latest',
    'region' => REGION,
    'endpoint' => HOST,
    'credentials' => [
        'key' => AWS_KEY,
        'secret' => AWS_SECRET_KEY,
    ],
]);
$result = $client->deleteObject(array(
    'Bucket' => $BucketName,
    'Key' => $FileKey,
));

结果死活创建不了$client对象,但只要把credentials参数删掉,$client就能正常初始化。查AWS文档说这是硬编码凭证的正确方式,但不同SDK版本的示例差异很大,搞得我一头雾水——而且我还没使用Composer,更不确定是不是加载方式的问题。

问题排查更新

后来发现代码本身是能跑的,问题出在endpoint参数上:

  • 当我用http://bucket.s3.amazonaws.com/作为HOST时,生成的请求地址变成了http://bucket.bucket.s3.amazonaws.com/key,直接返回404 Not Found;
  • 换成http://s3.amazonaws.com后,整个请求完全无法工作;
  • 干脆移除endpoint字段后,请求地址变成http://s3.amazonaws.com/bucket/key,返回了204状态码(代表请求成功但没有返回内容),但结果里的deletemarker还是false,对象根本没被删掉。那时候完全搞不懂怎么让deleteObject生成正确的effective uri,也疑惑204状态码为啥没对应实际的删除效果。

最终解决方案

最后才发现,移除endpoint字段后的代码本身是没问题的,真正的锅是S3存储桶的CORS配置没有允许DELETE方法!给存储桶的CORS规则加上DELETE权限后,一切就正常了。最终可用的代码如下:

require 'aws-autoloader.php';
$client = new Aws\S3\S3Client([
    'version' => 'latest',
    'region' => REGION,
    'credentials' => [
        'key' => AWS_KEY,
        'secret' => AWS_SECRET_KEY,
    ],
]);
$result = $client->deleteObject(array(
    'Bucket' => $BucketName,
    'Key' => $FileKey,
));

内容的提问来源于stack exchange,提问作者xmxmxmx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:59:43