J'essaie de me donner la permission de télécharger des fichiers existants dans un compartiment S3. J'ai modifié la stratégie relative aux compartiments, comme suit:
{
"Sid": "someSID",
"Action": "s3:*",
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucketname/AWSLogs/123123123123/*",
"Principal": {
"AWS": [
"arn:aws:iam::123123123123:user/myuid"
]
}
}
Je crois comprendre que l’ajout à la politique devrait me donner tous les droits sur "nom de compartiment" pour mon compte "myuid", y compris tous les fichiers déjà présents dans ce compartiment. Cependant, des erreurs d'accès avec accès refusé continuent à apparaître lorsque j'essaie de télécharger l'un de ces fichiers via le lien qui apparaît dans la console.
Des pensées?
David , vous avez raison, mais j’ai trouvé qu’en plus de ce que bennie a dit ci-dessous, vous devez également autoriser la vue (ou l’accès que vous souhaitez) aux "utilisateurs authentifiés" .
Mais une meilleure solution pourrait être d’éditer la stratégie de l’utilisateur pour accorder simplement l’accès au compartiment:
{
"Statement": [
{
"Sid": "Stmt1350703615347",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::mybucket/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": ["arn:aws:s3:::mybucket"],
"Condition": {}
}
]
}
Le premier bloc accorde toutes les autorisations S3 à tous les éléments du compartiment. Le second bloc accorde l’autorisation de liste sur le compartiment lui-même.
Changez la ressource arn:aws:s3:::bucketname/AWSLogs/123123123123/*
en arn:aws:s3:::bucketname/*
pour avoir tous les droits sur le nom de compartiment
Utilisez la méthode ci-dessous pour télécharger n'importe quel fichier sous une forme lisible par le public en utilisant TransferUtility
dans Android.
transferUtility.upload(String bucketName, String key, File file, CannedAccessControlList cannedAcl)
Exemple
transferUtility.upload("MY_BUCKET_NAME", "FileName", your_file, CannedAccessControlList.PublicRead);
Pour clarifier: ce n'est vraiment pas bien documenté, mais vous avez besoin de deux déclarations d'accès.
En plus de votre instruction qui autorise les actions à générer des ressources "arn: aws: s3 ::: bucketname/AWSLogs/123123123123/*", vous avez également besoin d'une deuxième instruction permettant à ListBucket de "arn: aws: s3 ::: bucketname", car en interne, le client Aws essaiera de répertorier le compartiment afin de déterminer son existence avant de lancer son action.
Avec la deuxième déclaration, cela devrait ressembler à:
"Statement": [
{
"Sid": "someSID",
"Action": "ActionThatYouMeantToAllow",
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucketname/AWSLogs/123123123123/*",
"Principal": {
"AWS": [
"arn:aws:iam::123123123123:user/myuid"
]
},
{
"Sid": "someOtherSID",
"Action": "ListBucket",
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucketname",
"Principal": {
"AWS": [
"arn:aws:iam::123123123123:user/myuid"
]
}
]
Remarque: Si vous utilisez IAM, ignorez la partie "Principal".
Allez à ce link et générez une politique. Dans le champ Principal
, donnez *
Dans la Actions
, définissez le Get Objects
Donnez la ARN
comme arn:aws:s3:::<bucket_name>/*
Ajoutez ensuite une instruction, puis générez une stratégie. Vous obtiendrez un fichier JSON, puis copiez-le et collez-le dans la stratégie.
Pour plus de détails, allez ici.