Amazon S3 copyObject权限

jwa*_*hol 24 amazon amazon-s3

我得到了所有权限的用户.

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用aws-sdk-php-2来放置和复制存储桶中的对象.

http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html

放置代码非常完美

                $client->putObject(array(
                'Bucket'     => 'kiosk',
                'Key'        => 'test/orders/test.csv',
                'SourceFile' => $sourcePath,
            ));
Run Code Online (Sandbox Code Playgroud)

通过https://console.aws.amazon.com/s3检查S3上是否创建了对象后,我正在执行下一个脚本.

        $result = $client->copyObject(array(
        'Bucket' => 'kiosk',
        'CopySource' => 'test/orders/test.csv',
        'Key' => 'test/test.csv',
    ));
Run Code Online (Sandbox Code Playgroud)

而我正在致命的错误:

Fatal error: Uncaught Aws\S3\Exception\S3Exception: AWS Error Code: AllAccessDisabled, Status Code: 403, AWS Request ID: XXX, AWS Error Type: client, AWS Error Message: All access to this object has been disabled, User-Agent: aws-sdk-php2/2.2.1 Guzzle/3.3.1 curl/7.19.7 PHP/5.4.13 thrown in phar:///usr/share/pear/AWSSDKforPHP/aws.phar/src/Aws/Common/Exception/NamespaceExceptionFactory.php on line 89
Run Code Online (Sandbox Code Playgroud)

手动上传文件后console.aws.amazon.com/s3我在尝试复制时看到不同的错误:

Fatal error: Uncaught Aws\S3\Exception\AccessDeniedException: AWS Error Code: AccessDenied, Status Code: 403, AWS Request ID: XXX, AWS Error Type: client, AWS Error Message: Access Denied, User-Agent: aws-sdk-php2/2.2.1 Guzzle/3.3.1 curl/7.19.7 PHP/5.4.13 thrown in phar:///usr/share/pear/AWSSDKforPHP/aws.phar/src/Aws/Common/Exception/NamespaceExceptionFactory.php on line 89
Run Code Online (Sandbox Code Playgroud)

我还尝试通过以下方式设置文件和文件夹的权限console.aws.amazon.com/s3:Grantee:Everyone,Open/Download和View Permission and Edit Permission

但仍然是同样的错误.

Jer*_*ris 67

我知道这是一个老问题,但我最近在处理遗留项目时遇到了同样的问题.

$this->client->copyObject([
    'Bucket'        => $this->bucket,
    'CopySource'    => $file,
    'Key'           => str_replace($source, $destination, $file),
]);
Run Code Online (Sandbox Code Playgroud)

除了copyObject继续抛出ACCESS DENIED错误之外,我的所有其他S3调用都有效.经过一番挖掘,我终于找到了原因.

AWS v2 SDK CopySource文档

我正在传递密钥,并假设传递的存储区是源和目标都使用的.事实证明这是一个不正确的假设.源必须以存储桶名称为前缀.

这是我的解决方案:

$this->client->copyObject([
    'Bucket'        => $this->bucket,
    // Added the bucket name to the copy source
    'CopySource'    => $this->bucket.'/'.$file,
    'Key'           => str_replace($source, $destination, $file),
]);
Run Code Online (Sandbox Code Playgroud)

它说"拒绝访问",因为它认为您的密钥/文件夹的第一部分实际上是存储桶的名称,该存储桶不存在或您实际上无权访问.

希望能帮助一些人出去!

  • 使用aws cli`aws s3api copy-object`命令时会发生同样的事情.您必须再次提供存储桶名称作为`--key`参数的一部分,即使您为`--bucket`参数指定它并且您正在同一存储桶中复制. (3认同)
  • 好的。没有注意他们在文档中放置了这个提示 `CopySource: "/sourcebucket/HappyFacejpg", `。 (3认同)

Pet*_*gad 25

找出问题在这里; 作为一个AWS新手,我在这里挣扎了一段时间,直到我意识到你设置的用户的每个策略都需要明确允许你正在使用的服务.

在这种情况下,我没有将用户设置为允许进入S3.

转到IAM然后转到用户并单击具有您正在使用的凭据的特定用户.从那里转到权限选项卡,然后单击附加用户策略并在选择策略模板下找到S3策略.这应该可以解决您的问题.

希望有所帮助!

  • 我做了,仍然得到AWS错误代码:AccessDenied错误类型:客户端任何指针请 (2认同)

小智 6

流行的答案是正确的,但仍然存在问题。必须包含 ACL 选项。

$this->client->copyObject([
  'Bucket'        => $this->bucket,
  // Added the bucket name to the copy source
  'CopySource'    => $this->bucket.'/'.$file,
  'Key'           => str_replace($source, $destination, $file),
  'ACL'           => 'public-read'
]);
Run Code Online (Sandbox Code Playgroud)

ACL 可以是以下值之一 'ACL' => 'private|public-read|public-read-write|authenticated-read|aws-exec-read|bucket-owner-read|bucket-owner-full-control',