2017-03-15 2 views
2

Voici mon code Java:com.amazonaws.services.s3.model.AmazonS3Exception: Accès refusé

 AmazonS3 conn = new AmazonS3Client(); 
     AmazonS3URI uri = new AmazonS3URI(s3uri); 
     ObjectListing objects = conn.listObjects(uri.getBucket(), uri.getKey()); 

Une tâche très simple, j'essaie d'utiliser le client Java pour accéder AmazonS3 S3, mais cette ligne conn.listObjects garde à défaut et m'a donné l'exception suivante:

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXXX), S3 Extended Request ID: xxxxxxxxx 
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1389) 
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:902) 
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:607) 
    at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376) 
    at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338) 
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287) 
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3826) 
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3778) 
    at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:610) 
    at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:588) 
  1. Un code d'erreur très évidente: 403 qui indique mes lettres de créance de SSFE ont tort, cependant, c'est exactement les mêmes informations d'identification que mes collègues utilisent pour ac Pour éviter la faute de frappe, j'ai littéralement effacé la précédente et utilisé la même que celle que mes collègues m'ont envoyée sous ~/.aws/

  2. I J'ai aussi étudié d'autres raisons possibles, on pourrait penser que ce seau S3 ne donne pas les permissions à mon rôle IAM, apparemment ce n'est pas mon cas non plus.

Une aide s'il vous plaît? Quel pourrait être le coupable?

+0

L'exécutez-vous à partir d'une instance Amazon EC2 ou de votre propre ordinateur? Pouvez-vous utiliser [AWS Command-Line Interface (CLI)] (http://aws.amazon.com/cli/) sur la même machine pour accéder à Amazon S3 via le 'aws s3 ls s3: // nom-du-bucket' ? –

+0

Je cours sur mon propre MacBook Pro. Oui, c'est la partie étrange. Je suis capable d'exécuter cette commande: 'aws s3 ls s3: // MON-BUCKET', donc je suis si confus comment est-ce possible. – FisherCoder

Répondre

3

Le AWS SDK pour Java a un DefaultAWSCredentialsProviderChain qui vérifie les informations d'identification dans cet ordre:

  • Variables d'environnement - AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY (RECOMMANDÉ car ils sont reconnus par tous les AWS SDKs et CLI sauf pour .NET), ou AWS_ACCESS_KEY et AWS_SECRET_KEY (uniquement reconnu par Java SDK)
  • Java Propriétés système - aws.accessKeyId et aws.secretKey
  • Cr profils edential fichier à l'emplacement par défaut (~/.aws/credentials) partagée par tous AWS SDKs et l'AWS CLI
  • informations d'identification délivrés par la si AWS_CONTAINER_CREDENTIALS_RELATIVE_URI variable d'environnement container service Amazon EC2 est défini et responsable de la sécurité a l'autorisation d'accéder à la variable
  • informations de profil de l'instance délivrés par le service de métadonnées Amazon EC2

Il est possible que vos informations d'identification sont définies avant votre fichier de configuration souhaité être consulté. Une manière de vérifier quelles informations d'identification sont utilisées est d'utiliser la commande aws iam get-user pour afficher l'utilisateur actuel. Vous pouvez également essayer cela en Java avec l'appel GetUser().

+0

Merci, je l'ai essayé, il retourne cette { "Utilisateur": { "UserName": "MY_DEFAULT_USER_NAME", "PasswordLastUsed": "2017-03-15T01: 59: 05Z", « CreateDate ":" 2016-04-30T02: 46: 19Z ", " UserId ":" ABCDEFGHIJKLMNOPQ ", " Chemin ":"/", " Arn ":" arn: aws: iam :: 123456789: utilisateur/MY_DEFAULT_USER_NAME " } } Ceci est l'utilisateur correct auquel j'attends. – FisherCoder

+0

La question est ... Quel utilisateur retourne votre programme Java, via l'appel GetUser()? Est-ce le même? –

+0

Génial, vous bercez! ^^ 'L'appel de GetUser()' renvoie un utilisateur différent, comment cela se produit-il? Comment pourrais-je résoudre ce problème? – FisherCoder