AWS Java SDK-Impossible de trouver une région via la chaîne de fournisseurs de région


J'ai parcouru la question intitulée "Définition de la région AWS par programme 1" mais elle ne fournit pas toutes les réponses dont j'ai besoin.

Q1: Je reçois un SDKClientException-Unable to find a region via the region provider chain. Ce que je fais mal? ou est-il une faute de frappe que j'ai manqué.

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());
    }


}

}

Q2: Quels changements de code doivent être effectués si je veux en construire une fonction Lambda? Je sais comment créer une fonction lambda et les rôles dont elle a besoin. Juste besoin de savoir si le code que j'ai écrit doit changer. Comment dois-je implémentez la classe LambdaFuctionHandler comme ci-dessous:

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;
}

}
Author: Madbreaks, 2017-05-24

4 answers

Concernant Q1, essayez de construire votre client en utilisant la syntaxe suivante:

AmazonS3 amazonS3 = AmazonS3Client.builder()
    .withRegion("us-east-1")
    .withCredentials(new AWSStaticCredentialsProvider(creds))
    .build();
 10
Author: mapm, 2017-07-13 13:11:37

Eh bien les étapes que vous pouvez prendre pour enquêter:

Veuillez vous assurer que votre fonction Lambda et S3 sont dans la même région. (Lorsque vous utilisez ProviderChain, il récupérera la région de la fonction Lambda

De plus, Vous ne devriez pas avoir besoin de spécifier les BasicCredentials(aws-key..etc) si vous utilisez Lambda.

Veuillez lire à propos du modèle d'autorisation Lambda (http://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html):

Fondamentalement, le rôle Lambda que vous attribuez devrait avoir l'autorisation d'accéder à S3.

Tout ce dont vous avez besoin pour configurer S3 est à peu près:

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

Pour le tester localement, assurez-vous d'avoir configuré les informations d'identification AWS localement.

, Vous pouvez vérifier si vous avez les informations d'identification, si vous allez dans .aws/informations d'identification (il contient la "aws-access-key", "aws-secret-key")

Http://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html

Pour configurer vos informations d'identification localement, tout ce que vous devez faire est d'exécuter la commande AWS Cli: aws configure ( http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.htm )

 5
Author: Ian, 2017-05-29 13:18:39

Comme mentionné dans la réponse ci-dessus, vous devez avoir S3 et lambda dans la même région et voici pourquoi -

Si vous ne définissez pas explicitement une région à l'aide des méthodes withRegion, le SDK consulte la chaîne de fournisseurs de région par défaut pour essayer de déterminer la région à utiliser. Une des méthodes utilisées est -

La variable d'environnement AWS_REGION est vérifiée. Si elle est définie, cette région est utilisée pour configurer le client.

Et dans le cas de Lambda -

Ceci la variable d'environnement est définie par le conteneur Lambda.

Enfin, pour utiliser la chaîne de fournisseur d'informations d'identification/région par défaut pour déterminer la région à partir de l'environnement, utilisez la méthode defaultClient du constructeur client.

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();

C'est la même chose que d'utiliser standard suivi de build.

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

Documentation AWS: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html

Plus de détails: Comment réparer " Impossible de trouver une région via la chaîne de fournisseurs de région" exception avec AWS SDK

 3
Author: Aniket Thakur, 2018-07-17 06:43:23

Cela a fonctionné pour moi.

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.AP_SOUTH_1).build();
 0
Author: Akhilesh Nagabhushan, 2018-07-20 05:32:36