Essayer de copier un fichier d'un compartiment S3 sur ma machine locale:
aws s3 cp s3://my-bucket-name/audio-0b7ea3d0-13ab-4c7c-ac66-1bec2e572c14.wav ./
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
Choses que j'ai confirmées:
aws-cli/1.11.13 Python/3.5.2 Linux/4.4.0-75-generic botocore/1.4.70
La politique de seau est destinée à accorder un large accès ouvert:
{
"Sid": "AdminAccess",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
}
Comment ai-je téléchargé cet objet?
J'ai téléchargé cet objet à l'aide de la stratégie de téléchargement signé AWS Signature v4 à partir d'une application Web du navigateur client directement vers AWS.
En regardant les propriétés de l'objet, je vois que le propriétaire de l'objet est "anonyme" et que "anonyme" est également autorisé à accéder à cet objet.
Je crois que c'est pourquoi je ne suis pas capable d'accéder à cet objet (je suis authentifié). Exemple: étant donné que l'utilisateur "anonyme" dispose d'une autorisation complète, je peux accéder via GET à l'aide d'un navigateur Web. Cela fonctionne comme prévu. Le compartiment S3 sert au téléchargement de fichiers qui deviennent ensuite disponibles pour la consommation publique.
Ainsi, lorsque le fichier est POSTé avec la stratégie de téléchargement, le propriétaire résultant est "Anonymous".
Dans ce cas, acl=bucket-owner-full-control
doit être utilisé lors du téléchargement de l'objet pour que le propriétaire du compartiment puisse contrôler l'objet . Ce faisant, le propriétaire sera toujours "Anonyme". Cependant, le propriétaire du compartiment (moi) en sera entièrement informé. permission et je devrais pouvoir accéder à l'objet après cela, via AWS CLI.
Notez que acl=ec2-bundle-read
est un paramètre par défaut codé en dur dans le dernier kit SDK AWS. Voir https://github.com/aws/aws-sdk-Java/blob/7844c64cf248aed889811bf2e871ad6b276a89ca/aws-Java-sdk-ec2/src/main/Java/com/amazonaws/services/ec2/util/2 # L77
Il était nécessaire de copier S3UploadPolicy.Java dans mon propre code (il s’agit d’une petite classe d’utilitaires entièrement portable) et de le modifier pour pouvoir utiliser acl=bucket-owner-full-control
. Et j'ai vérifié que cela permettait l'administration des objets téléchargés via AWS CLI.
Dans mon cas, l'erreur ci-dessus est apparue lorsque la machine qui tentait de contacter S3 avait l'heure du système était loin de celle actuelle . Définir une heure correcte a aidé.
AWS S3 vous renverra Interdit (403), même si le fichier n'existe pas pour des raisons de sécurité ..___, veuillez vous assurer que vous avez indiqué le chemin s3 correct lors du téléchargement.
Vous pouvez en lire plus à ce sujet ici
J'ai rencontré un problème d'autorisations similaire lorsque j'essayais de télécharger quelque chose que j'avais déjà téléchargé sur S3. Il s'avère que cela n'a rien à voir avec la stratégie bucket ni avec tout ce qui concerne la manière dont vos informations d'identification sont définies lors du téléchargement et la manière dont vous accordez des privilèges d'accès. Voir this pour plus d’informations sur plusieurs façons de résoudre le problème.