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;
}
}
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();
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.
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 )
Cela a fonctionné pour moi.
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.AP_SOUTH_1).build();