web-dev-qa-db-ja.com

Amazon S3 copyObjectアクセス許可

すべての権限を持つユーザーがいます。

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

Aws-sdk-php-2を使用して、バケットにオブジェクトを配置およびコピーしています。

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

Putコードは完璧に動作します

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

https://console.aws.Amazon.com/s でS3にオブジェクトが作成されたかどうかを確認した後、次のスクリプトを実行しています。

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

そして、致命的なエラーが発生しています:

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

ファイルを手動でアップロードした後、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

また、console.aws.Amazon.com/s3を介してファイルとフォルダーにアクセス許可を設定しようとします:被付与者:全員、オープン/ダウンロードおよび表示アクセス許可、編集アクセス許可

しかし、まだ同じエラー。

24
jwachol

これは古い質問ですが、最近、レガシープロジェクトで作業をしているときに同じ問題に遭遇しました。

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

copyObjectを除き、他のすべてのS3呼び出しは機能しましたが、ACCESS DENIEDエラーをスローし続けました。掘り下げた後、最終的に why を見つけました。

AWS v2 SDK CopySource Documentation

キーだけを渡し、渡されたバケットが送信元と宛先の両方で使用されるものであると仮定していました。それは間違った仮定です。ソースmustには、バケット名のプレフィックスが付いています。

ここに私の解決策がありました:

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

「アクセスが拒否されました」と表示されるのは、キー/フォルダの最初の部分が実際には存在しないか、実際にはアクセスできないバケットの名前だと考えているためです。

それが少数の人々を助けることを願っています!

62
Jeremy Harris

ここに問題が何であるかを見つけました。 AWSの初心者であるため、設定したユーザーの各ポリシーで、使用しているサービスを明確に許可する必要があることに気づくまで、ここで少し苦労しました。

この場合、ユーザーをS3に許可するように設定していませんでした。

その後、IAMに移動して[ユーザー]に移動し、使用している資格情報を持つ特定のユーザーをクリックします。そこから[アクセス許可]タブに移動し、[ユーザーポリシーの添付]をクリックして、[ポリシーテンプレートの選択]でS3ポリシーを見つけます。これで問題が解決するはずです。

お役に立てば幸いです!

24
Petrogad

人気のある答えは適切でしたが、まだ問題がありました。 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'
]);

ACLは、これらの値のいずれかです 'ACL' => 'private | public-read | public-read-write | authenticated-read | aws-exec-read | bucket-owner-read | bucket-owner-full-control'、

1
DoA