Клиент AWS, похоже, не читает файл конфигурации для чтения региона

#amazon-web-services #amazon-s3 #aws-cli #aws-config

Вопрос:

Я пытаюсь использовать свой код для доступа к S3 с помощью aws sdk и в сервисе Java. Но я получил следующее исключение.

Код, который я использую, выглядит следующим образом.

  1. настройте конструктор.
     ClientConfiguration clientConfiguration = new ClientConfiguration();
    clientConfiguration.setRetryPolicy( PredefinedRetryPolicies.getDefaultRetryPolicyWithCustomMaxRetries(5));
    
     AmazonS3ClientBuilder s3ClientCommonBuilder = AmazonS3ClientBuilder.standard()
         .withClientConfiguration(clientConfiguration)
         .withForceGlobalBucketAccessEnabled(true)
         .withPathStyleAccessEnabled(true);
    
         s3ClientCommonBuilder.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsKey, awsSecret)));
    
    
     return s3ClientCommonBuilder;
     
  2. создайте AwsS3Client
      AmazonS3ClientBuilder internalS3ClientBuilder = 
     createS3ClientCommonBuilder(s3bucket, awsKey, awsSecret);
     if (internalServiceEndpoint != null amp;amp; !internalServiceEndpoint.isEmpty()) {
         internalS3ClientBuilder.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(internalServiceEndpoint, Region.EU_Ireland.getFirstRegionId()));
     }
     

А затем во время выполнения, когда клиент пытается подключиться к s3, возникает следующее исключение.

 1) Error in custom provider, 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.
while locating AwsS3ClientProvider
at org.test.ApiServerBootstrap.configure(ApiServerBootstrap.java:103)
while locating org.test.AWSS3Client
for the 3rd parameter of org.testDataUploader.<init>(DataUploader.java:60)
at org.test.DataUploader.class(DataUploader.java:49)
while locating org.test.DataUploader
for the 3rd parameter of org.test.StoreService.<init>(StoreService.java:56)
at org.test.services.v3.StoreService.class(StoreService.java:53)
while locating org.test.StoreService
for the 1st parameter of org.test.verticles.EventBusConsumerVerticle.<init> 
(EventBusConsumerVerticle.java:35)
at 
org.test.verticles.EventBusConsumerVerticle.class(EventBusConsumerVerticle.java:35)
while locating org.test.verticles.EventBusConsumerVerticle
for the 3rd parameter of org.test.ApiServer.<init>(ApiServer.java:52)
while locating org.test.ApiServer

1 error
at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:226)
at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1053)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1086)
at org.test.ApiServer.main(ApiServer.java:46)
Caused by: 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:462)
at com.amazonaws.client.builder.AwsClientBuilder.configureMutableProperties(AwsClientBuilder.java:424)
at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46)
at org.test.AWSS3Client.create(AWSS3Client.java:99)
 

Я протестировал это на некоторых других компьютерах, чтобы убедиться, что неверна конфигурация моего клиента aws.

Мой файл .aws/config выглядит следующим образом

 $ cat .aws/config 
[default]
region = eu-west-1
output = json
 

мои учетные данные .aws/выглядят следующим образом.

 $ cat .aws/credentials 
[default]
aws_access_key_id=XXXXXXXX.....
aws_secret_access_key=XXXXXXXX
 

моя версия клиента aws выглядит следующим образом.

 $ aws --version
aws-cli/2.2.40 Python/3.8.8 Linux/5.11.0-34-generic exe/x86_64.ubuntu.20 prompt/off
 

Я признателен, если кто-нибудь сможет выяснить, чего мне не хватает для подключения клиента aws к s3.

Комментарии:

1. Ваш вопрос касается AWS SDK для Java, из которого произошла ошибка, или интерфейса командной строки AWS, для которого вы на самом деле предоставляете подробные сведения?

2. Исключение составляет AWS sdk для java. Как я уже упоминал, этот код успешно собран на сервере Ubuntu 16.04 Jenkins без каких-либо ошибок, которые идентичны моим учетным данным aws и файлам конфигурации(кстати, я использую ubuntu 20.04). Разница лишь в том, что на сервере Jenkins установлен клиент aws 1.X, где, как и в моем 2.2.X

3. Клиент AWS CLI, установленный на сервере, совершенно не имеет значения. Это не используется в SDK. Кроме того, это не ошибка времени сборки, это ошибка времени выполнения, поэтому утверждение, что он построен без ошибок на другом сервере, кажется неуместным.

4. Спасибо за обратную связь. Похоже, мой вопрос задан неправильно. Обновлена точная проблема. @MarkB

Ответ №1:

Вы хотите убедиться, что используете класс DefaultAWSCredentialsProviderChain() при создании своего S3Client.

Также вы можете создать переменную окружения AWS_REGION=eu-west-1

Комментарии:

1. Ваш вопрос касается использования SDK, поскольку вы показываете исключение кода Java. Для интерфейса командной строки необходимо задать два параметра: AWS_REGION и AWS_DEFAULT_REGION.