web-dev-qa-db-fra.com

Autorisation copyObject d'Amazon S3

J'ai un utilisateur avec toutes les autorisations.

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

J'utilise aws-sdk-php-2 pour mettre et copier des objets dans le bucket.

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

Mettez le code fonctionne parfaitement

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

Après avoir vérifié si l'objet créé sur S3 via https://console.aws.Amazon.com/s j'exécute le script suivant.

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

Et je reçois une erreur fatale:

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

Après avoir téléchargé le fichier manuellement console.aws.Amazon.com/s3, je vois une erreur différente lors de la tentative de copie:

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

J'essaie également de définir des autorisations sur le fichier et le dossier via console.aws.Amazon.com/s3: Bénéficiaire: Tout le monde, Ouvrir/Télécharger et afficher la permission et Modifier la permission

Mais toujours la même erreur.

24
jwachol

Je sais que c'est une vieille question, mais j'ai rencontré le même problème récemment en travaillant sur un projet hérité.

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

Tous mes autres appels S3 ont fonctionné à l'exception de copyObject a continué de générer une erreur ACCESS DENIED . Après avoir creusé, j'ai finalement compris pourquoi .

AWS v2 SDK CopySource Documentation

Je passais juste la clé et supposais que le seau en cours de passage était ce que la source et la destination utiliseraient. Il s'avère que c'est une hypothèse incorrecte. La source doit avoir le nom du compartiment préfixé.

Voici ma solution:

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

Il indique "Accès refusé" car il pense que la première partie de votre clé/dossier est en fait le nom du compartiment qui n'existe pas ou auquel vous n'avez vraiment pas accès.

J'espère que cela aide quelques personnes!

62
Jeremy Harris

J'ai découvert le problème ici; étant un débutant AWS, j'ai lutté un peu ici jusqu'à ce que je réalise que chaque stratégie pour les utilisateurs que vous définissez doit autoriser clairement le service que vous utilisez.

Dans ce cas, je n'avais pas configuré l'utilisateur pour qu'il soit autorisé à accéder à S3.

Accédez à IAM, puis accédez aux utilisateurs et cliquez sur l'utilisateur particulier qui possède les informations d'identification que vous utilisez. À partir de là, accédez à l'onglet Autorisations, puis cliquez sur Attacher la stratégie utilisateur et recherchez la stratégie S3 sous le modèle de stratégie sélectionné. Cela devrait résoudre votre problème.

J'espère que cela pourra aider!

24
Petrogad

La réponse populaire était sur le point, mais avait encore des problèmes. Dû inclure l'option 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'
]);

L'ACL peut être l'une de ces valeurs 'ACL' => 'private | public-read | public-read-write | authenticated-read | aws-exec-read | bucket-owner-read | bucket-owner-full-control',

1
DoA