如何测试S3对象是否不存在AWS PHP SDK(版本3)?
我已经为编写了一个集成,用于发送S3 bucket上文件的密钥,并检索一个预签名的url,大致如下。这非常有效,除了我现在需要检查文件是否存在于s3上,如果不存在则返回空字符串 我正在使用下面的代码执行此操作:如何测试S3对象是否不存在AWS PHP SDK(版本3)?,php,amazon-web-services,amazon-s3,aws-sdk,Php,Amazon Web Services,Amazon S3,Aws Sdk,我已经为编写了一个集成,用于发送S3 bucket上文件的密钥,并检索一个预签名的url,大致如下。这非常有效,除了我现在需要检查文件是否存在于s3上,如果不存在则返回空字符串 我正在使用下面的代码执行此操作: <?php public function getUrl($key, $region, $version, $fileBucket): string { $this->s3Client = new Aws\S3\S3Client([ 'region'
<?php
public function getUrl($key, $region, $version, $fileBucket): string
{
$this->s3Client = new Aws\S3\S3Client([
'region' => $region,
'version' => $version,
]);
if ($this->s3Client->doesObjectExist($fileBucket, $key) === false) {
return '';
}
$cmd = $this->s3Client->getCommand('GetObject', [
'Bucket' => $fileBucket,
'Key' => $key
]);
$request = $this->s3Client->createPresignedRequest($cmd, $preSignedExpiration);
$preSignedUrl = (string) $request->getUri();
return $preSignedUrl ?? '';
}
s3存储桶策略如下所示:
{
"Sid": "dev-web-app-get-policy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::2222222222:role/example-dev-us-east-1-111111111111"
},
"Action": [
"s3:GetObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::example-dev-us-east-1-111111111111",
"arn:aws:s3:::example-dev-us-east-1-111111111111/*"
]
}
因此,我似乎应该能够获得所需的资源。为了安全起见,我列出了假桶名。但是我已经检查了控制台中的那些mathcs3
当您尝试调用HeadObject的api时,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::example-dev-us-east-1-111111111111",
"arn:aws:s3:::example-dev-us-east-1-111111111111/*"
]
}
]
}
$this->s3Client->headObject([
'Bucket' => $fileBucket,
'Key' => $key
]);
我得到以下信息:
"Error executing \"HeadObject\" on \"https://example-dev-us-east-1-111111111111/54bf7350-a819-41dd-9da3-3710eb8b095a-Screenshot_2021-03-09_20-15-12.png\"; AWS HTTP error: Client error: `HEAD https://example-dev-us-east-1-111111111111/54bf7350-a819-41dd-9da3-3710eb8b095a-Screenshot_2021-03-09_20-15-12.png` resulted in a `403 Forbidden` response (client): 403 Forbidden (Request-ID: XR6W77BB817407K2) - ",
"url": "/files.json"
不确定这是否有帮助
谢谢 调用API需要
s3:GetObject
权限,这是PHP SDK在代码调用doesObjectExist()
时调用的
如果请求的对象不存在,则返回错误AmazonS3
取决于您是否还具有s3:ListBucket权限
- 如果您对bucket拥有s3:ListBucket权限,那么AmazonS3 返回HTTP状态代码404(“无此类密钥”)错误
- 如果你不 如果拥有s3:ListBucket权限,AmazonS3将返回HTTP状态 代码403(“访问被拒绝”)错误
因此,您可能有s3:ListBucket,但没有s3:GetObject。资源应该是s3 ARN,而不是简单地以bucket名称作为前缀。他们说得对吗?您是否尝试使用具有这些凭据的awscli来创建HeadObject或GetObject?仅供参考,这不是一个桶政策;这是IAM策略。仅供参考,您可以为任何对象创建预签名URL,包括不存在的对象和您无权访问的对象。当您尝试访问实际对象时,失败会在稍后出现,因此不要理解您能够创建预签名URL的事实(无论权限如何,它几乎总是会成功)。根据我的回答,如果您在调用HeadObject时得到404,那么您就有S3:ListBucket,而不是S3:GetObject。如果得到403,那么就没有S3:ListBucket。我会检查S3 bucket是否没有冲突的策略。我将用awscli测试HeadObject和GetObject的相同凭据。您最初提到您使用的是IAM用户,但现在显示的是一个bucket策略,似乎暗示了跨帐户角色权限。这是交叉账户吗?是什么导致S3 API请求-是不同帐户中的IAM用户还是不同帐户中的IAM角色?