it-swarm.com.ru

AWS Java SDK - невозможно найти регион через цепочку поставщиков региона

Я прошел через вопрос «Установка региона AWS программно 1», но он не дает всех ответов, которые мне нужны.

Q1: я получаю SDKClientException-Unable to find a region via the region provider chain. Что я делаю неправильно? или есть опечатка, которую я пропустил.

public class CreateS3Bucket {

public static void main(String[] args) throws IOException {

    BasicAWSCredentials creds = new BasicAWSCredentials("aws-access-key", "aws-secret-key");
    AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(creds)).build();

    Region region = Region.getRegion(Regions.US_EAST_1);
    s3Client.setRegion(region);

    try {
        String bucketName = "testBucket" + UUID.randomUUID();
        s3Client.createBucket(bucketName);
        System.out.println("Bucket Created Successfully.");

    } catch(AmazonServiceException awse) {

        System.out.println("This means that your request made it AWS S3 but got rejected");
        System.out.println("Error Message:" +awse.getMessage());
        System.out.println("Error Message:" +awse.getErrorCode());
        System.out.println("Error Message:" +awse.getErrorType());
        System.out.println("Error Message:" +awse.getRequestId());

    } catch (AmazonClientException ace) {

        System.out.println("The Amazon Client encountered an Error with network Connectivity");
        System.out.println("Error Message:" + ace.getMessage());
    }


}

}

В2: Какие изменения в коде необходимо выполнить, если я хочу создать из них лямбда-функцию? Я знаю, как создать лямбда-функцию и роли, в которых она нуждается. Просто нужно знать, нужно ли менять код, который я написал. Как мне реализовать класс LambdaFuctionHandler, как показано ниже:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

 public class LambdaFunctionHandler implements RequestHandler<String, String> {

@Override
public String handleRequest(String input, Context context) {
    context.getLogger().log("Input: " + input);


    return null;
}

}
16
Codistan

Что касается Q1, попробуйте собрать ваш клиент, используя следующий синтаксис:

AmazonS3 amazonS3 = AmazonS3Client.builder()
    .withRegion("us-east-1")
    .withCredentials(new AWSStaticCredentialsProvider(creds))
    .build();
13
mapm

Как упоминалось в ответе выше, вам нужно иметь S3 и лямбду в одном регионе, и вот почему

Если вы явно не задаете регион с помощью методов withRegion, SDK обращается к цепочке поставщиков региона по умолчанию, чтобы попытаться определить регион для использования. Один из используемых методов -

Переменная среды AWS_REGION проверена. Если он установлен, этот регион используется для настройки клиента.

А в случае лямбды -

Эта переменная окружения задается контейнером Lambda.

Наконец, чтобы использовать цепочку провайдеров учетных данных/региона по умолчанию для определения региона из среды, используйте метод defaultClient компоновщика клиента.

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();

Это то же самое, что и использование стандарта с последующей сборкой.

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

Документация AWS: https://docs.aws.Amazon.com/sdk-for-Java/v1/developer-guide/Java-dg-region-selection.html

Дополнительные детали: Как исправить исключение «Невозможно найти регион через цепочку провайдеров региона» в AWS SDK

PS: выше ссылка идет на мой личный блог, в котором есть дополнительные подробности об этом.

7
Aniket Thakur

Ну, шаги, которые вы можете предпринять, чтобы исследовать:

Пожалуйста, убедитесь, что ваша лямбда-функция и S3 находятся в одном регионе. (Когда вы используете ProviderChain, он выберет регион из функции Lambda

Кроме того, вам не нужно указывать BasicCredentials (aws-key..etc), если вы используете Lambda. 

Пожалуйста, прочитайте о модели Lambda Permission ( http://docs.aws.Amazon.com/lambda/latest/dg/intro-permission-model.html ): 

По сути, назначаемая вам лямбда-роль должна иметь разрешение на доступ к S3. 

Все, что вам нужно для настройки S3, это: 

private static final AmazonS3 s3Client = 
AmazonS3ClientBuilder.defaultClient();

Чтобы проверить его локально, убедитесь, что вы настроили учетные данные AWS локально. 

Вы можете проверить, есть ли у вас учетные данные, если вы зайдете в .aws/credentials (он будет содержать «aws-access-key», «aws-secret-key») 

http://docs.aws.Amazon.com/sdk-for-Java/v1/developer-guide/setup-credentials.html

Чтобы настроить свои учетные данные локально, все, что вам нужно сделать, это запустить команду AWS Cli: aws configure ( http://docs.aws.Amazon.com/cli/latest/userguide/cli-chap-getting-started. htm )

6
Ian

Это сработало для меня.

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.AP_SOUTH_1).build();
1
Akhilesh Nagabhushan