web-dev-qa-db-fra.com

AmazonS3ClientBuilder.defaultClient () ne parvient pas à tenir compte de la région?

Le kit de développement logiciel Amazon Java Java a marqué les constructeurs pour AmazonS3Client Déconseillé en faveur de certains AmazonS3ClientBuilder.defaultClient(). Cependant, la mise en œuvre de la recommandation n'entraîne pas la création d'un client AmazonS3. cela fonctionne de la même manière. En particulier, le client n'a pas réussi à rendre compte de la région. Si vous exécutez les tests ci-dessous, le test thisFails illustre le problème.

public class S3HelperTest {
  @Test
  public void thisWorks() throws Exception {
    AmazonS3 s3Client = new AmazonS3Client();  // this call is deprecated
    s3Client.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build());
    assertNotNull(s3Client);
  }

  @Test
  public void thisFails() throws Exception {
    AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
    /*
     * The following line throws like 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.
     */
    s3Client.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build());
  }
}

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.
    at com.amazonaws.client.builder.AwsClientBuilder.setRegion(AwsClientBuilder.Java:371)
    at com.amazonaws.client.builder.AwsClientBuilder.configureMutableProperties(AwsClientBuilder.Java:337)
    at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.Java:46)
    at com.amazonaws.services.s3.AmazonS3ClientBuilder.defaultClient(AmazonS3ClientBuilder.Java:54)
    at com.climate.tenderfoot.service.S3HelperTest.thisFails(S3HelperTest.Java:21)
    ...

S'agit-il d'un bogue AWS SDK? Existe-t-il une "chaîne de fournisseurs de régions par défaut" ou un mécanisme pour dériver la région de l'environnement et la définir dans le client? Il semble vraiment faible que la méthode pour remplacer la dépréciation n'aboutisse pas à la même capacité.

10
Bob Kuhar

On dirait qu'une région est requise pour le constructeur. Probablement ce fil est lié (j'utiliserais .withRegion(Regions.US_EAST_1) bien que dans la 3ème ligne):

Pour émuler le comportement précédent (aucune région configurée), vous devrez également activer "l'accès forcé au compartiment global" dans le générateur de client:

AmazonS3 client = 
        AmazonS3ClientBuilder.standard()
                             .withRegion("us-east-1") // The first region to try your request against
                             .withForceGlobalBucketAccess(true) // If a bucket is in a different region, try again in the correct region
                             .build();

Cela supprimera l'exception que vous avez reçue et réessayera automatiquement la demande sous la région de l'exception. Il est rendu explicite dans le générateur afin que vous soyez conscient de ce comportement entre régions. Remarque: Le SDK mettra en cache la région de compartiment après la première défaillance, de sorte que chaque demande contre ce compartiment ne doit pas se produire deux fois.


De plus, à partir de la documentation AWS si vous souhaitez utiliser AmazonS3ClientBuilder.defaultClient();, vous devez avoir les fichiers ~/.aws/credentials et ~/.aws/config

~/.aws/contenu des informations d'identification:

[default]
aws_access_key_id = your_id
aws_secret_access_key = your_key

~/.aws/config contents:

[default]
region = us-west-1

À partir de la même page documentation AWS , si vous ne voulez pas coder en dur la région/les informations d'identification , vous pouvez les avoir comme les variables d'environnement dans votre machine Linux de la manière habituelle:

export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key
export AWS_REGION=your_aws_region
17
Battle_Slug

Créez un fichier nommé "config" sous .aws. Et placez-le sous le contenu.

~/.aws/config contents:

[default]
region = us-west-1
output = json
    BasicAWSCredentials creds = new BasicAWSCredentials("key_ID", "Access_Key");
    AWSStaticCredentialsProvider provider = new 
    AWSStaticCredentialsProvider(creds);

    AmazonSQS sqs =AmazonSQSClientBuilder.standard()
    .withCredentials(provider)
    .withRegion(Regions.US_EAST_2)
    .build();
0
aly