2013-06-03 1 views
16

Ich habe Benutzer mit allen Berechtigungen.Amazon S3 copyObject Erlaubnis

Ich benutze aws-sdk-php-2, um Objekte in den Bucket zu legen und zu kopieren.

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

Put Code funktioniert perfekt

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

Nach dem Check, wenn das Objekt über https://console.aws.amazon.com/s3 auf S3 erstellt ich das nächste Skript bin ausführen.

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

Und ich bin immer fataler Fehler:

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 

Nach Upload-Datei manuell console.aws.amazon.com/s3 ich verschiedene Fehler angezeigt, wenn zu kopieren versuchen:

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 

Ich versuche auch, Berechtigungen für Datei und Ordner über console.aws.amazon.com/s3 festzulegen: Grantee: Jeder, Open/Download und View Permission und Edit Permission

Aber immer noch der gleiche Fehler.

+0

Ich habe die gleiche Fehlermeldung beim Zugriff auf die Objekte in S3 ... Haben Sie die Antwort gefunden? – insanepaul

+0

Für alle anderen, die dieses Problem haben, dachte ich, ich würde meine Lösung teilen - Mein Problem war, dass ich eine Datei mit einem Benutzerkonto hochgeladen hatte und versuchte, sie mit einem anderen Benutzer zu kopieren, was zu dem Fehler Zugriff verweigert führte. –

Antwort

22

herausgefunden, was das Problem hier ist; Da ich ein AWS-Neuling bin, habe ich hier ein wenig gerungen, bis ich feststellte, dass jede Richtlinie für die von Ihnen festgelegten Benutzer den von Ihnen verwendeten Dienst eindeutig zulassen muss.

In diesem Fall hatte ich nicht festgelegt, dass der Benutzer in S3 zugelassen werden soll.

Gehe zu IAM, dann gehe auf Benutzer und klicke auf den bestimmten Benutzer mit den Zugangsdaten, die du benutzt. Von dort gehen Sie auf die Registerkarte Berechtigungen, klicken Sie dann auf Benutzerrichtlinie anhängen und finden Sie die S3-Richtlinie unter der ausgewählten Richtlinienvorlage. Dies sollte dein Problem beheben.

Hoffe, dass hilft!

+1

Ich habe und bekomme immer noch AWS Fehlercode: AccessDenied Fehlertyp: Client alle Zeiger bitte – mithra

30

Ich weiß, dass dies eine alte Frage ist, aber ich stieß kürzlich bei der Arbeit an einem Legacy-Projekt auf dasselbe Problem.

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

Alle die meinen anderen S3 Anrufe arbeitete mit Ausnahme copyObject einen ACCESS DENIED Fehler werfen fortgesetzt. Nach einigem Graben fand ich schließlich heraus why.

AWS v2 SDK CopySource Documentation

ich nur den Schlüssel vorging und macht die Annahme, dass der Eimer war, was beide verwenden würde die Quelle und das Ziel weitergeleitet werden. Stellt sich heraus, dass dies eine falsche Annahme ist. Die Quelle muss den Bucket-Namen als Präfix haben.

Hier war meine Lösung:

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

Er sagt: „Zugriff verweigert“, weil es der erste Teil Ihrer Schlüssel denkt/Ordner ist eigentlich der Name des Eimers, die entweder nicht oder sie wirklich existiert don habe keinen Zugriff auf.

Hoffe das hilft ein paar Leute aus!

+2

Das gleiche passiert, wenn Sie den Befehl aws CLI 'aws s3api copy-object' verwenden. Sie müssen den Bucket-Namen erneut als Teil des '--key'-Arguments angeben, auch wenn Sie ihn für das' -Bucket'-Argument angegeben haben und Sie innerhalb desselben Buckets kopieren. –