2017-05-08 1 views
3

J'utilise aws-java-sdk version 1.11.104. Selon la AWS credentials doc la région par défaut est us-east-1, mais quand je fais quand je crée définit pas la région manuellement un client, comme ceci:Définition de la région AWS par programme

AWSCredentialsProvider awsCredentialsProvider = 
    new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsAccessKey, awsSecretKey)); 
AmazonS3 s3Client = 
    AmazonS3ClientBuilder.standard().withCredentials(awsCredentialsProvider).build(); 

Je reçois cette erreur:

com.amazonaws.SdkClientException: 
    Unable to find a region via the region provider chain. 
    Must provide an explicit region in the builder or setup environment to supply a region. 
  1. Pourquoi la région par défaut n'est-elle pas utilisée?

    J'ai essayé d'ajouter ce qui suit avant mon code ci-dessus, mais cela ne fonctionne toujours pas.

    System.setProperty(SDKGlobalConfiguration.AWS_REGION_ENV_VAR, "us-east-1"); 
    
  2. Comment définir par programmation la région AWS? (Je voudrais le mettre à l'exécution pour toutes les classes de mon projet).

Merci.

Edit:

Je sais que je peux utiliser .withRegion() sur le constructeur de clients, mais je me attendais à une région par défaut, ou la région choisi à partir d'une variable d'environnement à travers la chaîne des fournisseurs de la région par défaut.

+0

2e question http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/client/builder/AwsClientBuilder.html#withRegion-com.amazonaws.regions.Regions- –

+0

1ère question http: //docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html –

+0

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/ com/amazonaws/client/builder/AwsClientBuilder.html # setRegion-java.lang.String- – alfasin

Répondre

2

I was expecting a default region, or, the region picked from an environment variable through the default region provider chain.

Ouais comme je l'ai lu le code, il ne dispose pas d'une région par défaut:

  • AmazonEC2ClientBuilder étend (un peu) AwsClientBuilder.
  • AwsClientBuilder utilise par défaut le DefaultAwsRegionProviderChain.
  • DefaultAwsRegionProviderChain utilise 3 mécanismes pour déterminer la région:
    • AwsEnvVarOverrideRegionProvider qui regarde dans la AWS_REGION variable d'environnement que vous ne pouvez pas ensemble lors de l'exécution. Ou ne devrait pas (voir ci-dessous). Qui le lit à partir de votre fichier de profil AWS.
    • AwsProfileRegionProvider
    • InstanceMetadataRegionProvider qui essaie de rechercher quelle instance EC2 vous êtes sur et prenez sa région.
  1. Why isn't the default region used? (see these aws docs)

Je ne vois pas dans le code toute référence à us-east-1 dans la source, sauf dans AwsHostNameUtils.parseRegionName(...). Je ne suis pas sûr où cela est utilisé cependant.

System.setProperty(SDKGlobalConfiguration.AWS_REGION_ENV_VAR, "us-east-1");

Oui, l'environnement n'est pas la même chose qu'une propriété système. Il y a gross hacks qui vous permettent de modifier les variables d'environnement lors de l'exécution mais attention l'utilisateur.

+0

Merci d'avoir répondu. Votre lien vers le document AWS est le même que celui que j'ai indiqué dans ma question, et il est écrit "Si vous ne sélectionnez pas de région, alors us-east-1 sera utilisé par défaut". ce qui est déroutant ... En ce qui concerne les variables d'environnement, c'est juste pour tester, localement, parce que mes autres environnements tels que la production capturent la région 'AwsEnvVarOverrideRegionProvider' ou' AwsProfileRegionProvider'. Je ne veux pas utiliser '.withRegion()' et je ne veux pas que tous les développeurs de mon équipe touchent leur système uniquement pour tester les clients AWS. –

+0

Si vous voulez que @ MaximeLaval alors j'utiliserais un 'AwsRegionProviderChain' différent. Vous pouvez prendre celui par défaut, puis ajouter dans votre propre classe qui recherche une propriété système ou une variable d'environnement. – Gray

+0

Mais alors je devrais le passer à chaque client que je crée, même chose qu'en utilisant '.withRegion()', et je ne veux pas modifier le code existant, je veux pouvoir le tester tel quel. Je suppose que je vais utiliser la réflexion pour définir les variables d'environnement. –

0

J'ai rencontré le même problème. Et mon problème est l'autorisation de lire le fichier ~/.aws/config.Je le change en 644, que tout le monde peut lire. Alors ça marche. J'espère que cela pourrait aider.