2016-01-07 5 views
1

En utilisant le SDK java Amazon AWS, j'obtiens une exception 403 AccessDenied inexplicable lors de l'appel de la méthode AmazonS3Client.getObject(). Ce qui est étrange ici, c'est que je télécharge l'objet avec le même AmazonS3Client donc le propriétaire de la ressource d'objet devrait être le même.Inexplicaable AmazonS3Client getObject() 403 AccessDenied exception

ClientConfiguration config = new ClientConfiguration(); 
    config.setProtocol(Protocol.HTTP); // TODO Change to HTTPS? 
    AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKeyID","mySecretAccessKey"); 
    AmazonS3 amazonS3 = new AmazonS3Client(awsCredentials, config); 
    amazonS3.setEndpoint(serviceInfo.getHost()); 
    S3ClientOptions options = new S3ClientOptions(); 
    options.setPathStyleAccess(true); 
    amazonS3.setS3ClientOptions(options); 

    amazonS3.putObject(“myBucket”, “keyVal”, file); 
    amazonS3.getObject(“myBucket”, “keyVal”); //AccessDenied 

Même si je spécifie une ACL avec l'appel putObject(), je reçois toujours l'exception AccessDenied.

Owner owner = amazonS3.getS3AccountOwner(); 
AccessControlList acl = new AccessControlList(); 
acl.grantPermission(new CanonicalGrantee(owner.getId()), Permission.Read); 
amazonS3.putObject(new PutObjectRequest("mybucket", "myKey", f).withAccessControlList(acl)); 
amazonS3.getObject(“myBucket”, “keyVal”); //AccessDenied Still!!! 

Je l'ai testé en incluant une ACL avec donataire ALL_USERS à l'appel amazonS3.putObject() et cela me permet d'utiliser l'appel amazonS3.getObject() correct sans exception il semble comme un problème d'autorisations quelque part. Mais où?! «Par défaut, toutes les ressources Amazon S3, telles que les compartiments, les objets et les sous-ressources connexes (par exemple, la configuration du cycle de vie et la configuration du site Web), sont privées: seul le propriétaire des ressources, un compte AWS qui l'a créé, peut accéder à la ressource. »

Modifier

Je l'ai dit à l'origine que j'utilise le client RiakCS pour se connecter à S3. au moment de cette modification, il semble y avoir un problème avec RiakCS

+0

Le propriétaire des ressources est un compte AWS, et non un utilisateur individuel dans ce compte AWS; l'utilisateur doit toujours avoir l'autorisation d'accéder à l'objet, qui est influencé par la stratégie de compartiment et les stratégies d'utilisateur et de groupe IAM, de sorte que «même utilisateur» ne signifie pas nécessairement que vous pouvez lire ce que vous avez écrit. Les politiques doivent être là pour le permettre. Montrez votre seau et vos politiques d'utilisateur, peut-être? En outre, êtes-vous nouveau à S3 et/ou AWS ou était-ce une configuration de travail qui a cessé de fonctionner? –

+0

De plus, l'objet que vous avez téléchargé est-il visible dans la console S3? Pouvez-vous réellement le télécharger manuellement en utilisant la capacité de téléchargement de la console, et utilisez-vous le même utilisateur IAM pour accéder à la console et à l'API? –

+0

Oui, je suis nouveau à S3 et oui l'objet est visible en utilisant ma console Cyberduck S3 et je peux télécharger l'objet à travers cela. J'aurais dû le mentionner mais j'utilise le service Riak CS donc je n'ai jamais explicitement créé un compte utilisateur et AWS. En appelant 'amazonS3.getBucketPolicy (" myBucket ")' il renvoie null. – McLovin

Répondre

1

Probablement votre Riak CS Le point de terminaison S3 ne prend pas en charge ou n'est pas configuré pour les signatures AWS v4. GetObject semble être spécial à cet égard car il utilise par défaut une signature v4 dans la version actuelle du SDK.

Ce que vous pouvez faire est de configurer le client pour utiliser des signatures v2 à la place:

ClientConfiguration opts = new ClientConfiguration(); 
opts.setSignerOverride("S3SignerType"); // NOT "AWS3SignerType" 
AmazonS3Client s3 = new AmazonS3Client(opts); 

voir la discussion ici: https://github.com/aws/aws-sdk-java/issues/372

-2

Dans la console amazon S3 si vous naviguez vers votre dossier spécifique, vous trouverez le menu "permissions" sous l'onglet "propriétés". Vous devez définir le bénéficiaire sur "Tout le monde" et cocher les cases nécessaires.

+0

Je ne suis pas du tout convaincu que c'est exact. –

+0

Je ne peux pas rendre le public de mon objet à tout le monde – McLovin