Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试S3对象是否不存在AWS PHP SDK(版本3)?_Php_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

如何测试S3对象是否不存在AWS PHP SDK(版本3)?

如何测试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'

我已经为编写了一个集成,用于发送S3 bucket上文件的密钥,并检索一个预签名的url,大致如下。这非常有效,除了我现在需要检查文件是否存在于s3上,如果不存在则返回空字符串

我正在使用下面的代码执行此操作:

<?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角色?