Le SDK Amazon Java a marqué les constructeurs pour AmazonS3Client
désapprouvé au profit de certains AmazonS3ClientBuilder.defaultClient()
. Cependant, suivre la recommandation n'aboutit pas à un client AmazonS3 qui 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
montre le problème.AmazonS3ClientBuilder.defaultClient() ne peut pas tenir compte de la région?
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)
...
Est-ce un bogue AWS SDK? Existe-t-il une «chaîne de fournisseurs par défaut dans la région» ou un mécanisme permettant de dériver la région de l'environnement et de la définir dans le client? Il semble vraiment faible que la méthode pour remplacer la dépréciation ne donne pas la même capacité.
Ci-dessous est comment je crée le client s3: AmazonS3 s3client = AmazonS3ClientBuilder.standard(). build(); –
@JohnHanley Je suis un peu réticent à coder le 'withRegion (" us-east-1 ")' comme cette application doit être déployée dans plusieurs régions. J'imagine que je pourrais en tirer des conclusions sur l'environnement, mais je ne connais pas assez le fonctionnement des informations d'identification des instances et je crains que mon travail sur mon bureau échoue lorsqu'il est déployé dans AWS. J'espérais trouver un moyen de tirer parti de DefaultAwsRegionProviderChain. –
La méthode standard consiste à utiliser les "variables d'environnement". Je n'ai pas utilisé DefaultAwsRegionProviderChain car je sais où est mon compartiment et je l'ai mis dans les variables d'environnement. –