使用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
相关产品推荐
相关产品推荐

