web-dev-qa-db-fra.com

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

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. Qu'est-ce que je fais mal? ou y a-t-il une faute de frappe que j'ai manquée?.

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 sont les changements de code nécessaires si je souhaite créer une fonction Lambda à partir de celle-ci? 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 être changé. Comment dois-je implémenter 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;
}

}
16
Codistan

En ce qui concerne Q1, essayez de créer votre client en utilisant la syntaxe suivante:

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

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égions par défaut pour tenter 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 cette option est définie, cette région est utilisée pour configurer le client.

Et dans le cas de Lambda -

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

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

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();

Cela revient à 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

More detials: Comment résoudre l’exception "Impossible de trouver une région via la chaîne de fournisseurs de régions" avec AWS SDK

PS: Le lien ci-dessus mène à mon blog personnel qui contient des détails supplémentaires à ce sujet.

7
Aniket Thakur

Eh bien, les mesures que vous pouvez prendre pour enquêter:

Assurez-vous que votre fonction Lambda et S3 se trouvent dans la même région. (Lorsque vous utilisez ProviderChain, il récupérera la région à partir de la fonction Lambda

De même, vous ne devriez pas avoir besoin de spécifier BasicCredentials (aws-key..etc) si vous utilisez Lambda. 

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

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

Tout ce dont vous avez besoin pour configurer S3, c'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/credentials (Cela contiendra les "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, il vous suffit d'exécuter la commande AWS Cli: aws configure ( http://docs.aws.Amazon.com/cli/latest/userguide/cli-chap-getting-started. htm )

6
Ian

Cela a fonctionné pour moi.

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