27

すべての権限を持つユーザーを取得しました。

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

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,
            ));

https://console.aws.amazon.com/s3を介して 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: 被付与者: 全員、開く/ダウンロードと表示のアクセス許可、およびアクセス許可の編集

しかし、それでも同じエラーです。

4

3 に答える 3

87

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

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

ACCESS DENIEDエラーcopyObjectをスローし続けることを除いて、他のすべての 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),
]);

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

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

于 2016-08-11T17:57:04.487 に答える
25

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

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

IAM に移動してから、ユーザーに移動し、使用している資格情報を持つ特定のユーザーをクリックします。そこから [Permissions] タブに移動し、[Attach User Policy] をクリックして、[select policy template] の下にある S3 ポリシーを見つけます。これで問題が解決するはずです。

それが役立つことを願っています!

于 2013-08-31T00:03:28.773 に答える
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'
]);

ACL は次のいずれかの値になります 'ACL' => 'private|public-read|public-read-write|authenticated-read|aws-exec-read|bucket-owner-read|bucket-owner-full-control',

于 2019-05-07T23:44:28.027 に答える