AWS Java SDK - Unable to find a region via the region provider chain
I have gone through the question titled "Setting the AWS region programmatically 1" but it doesn't provide all the answers I need.
Q1: I'm getting a SDKClientException-Unable to find a region via the region provider chain
. What am I doing wrong? or is there a typo that I missed.
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: What code changes needs to be done if I want to build a Lambda Function out of it? I'm aware how to create a lambda function and roles that it needs. Just need to know if the code that I have written needs to changed. How should I implement the LambdaFuctionHandler class as below:
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;
}
}
Solution 1:
Regarding Q1, try to build your client using the following syntax:
AmazonS3 amazonS3 = AmazonS3Client.builder()
.withRegion("us-east-1")
.withCredentials(new AWSStaticCredentialsProvider(creds))
.build();
Solution 2:
As mentioned in the answer above you need to have S3 and lambda in same region and here's why-
If you don't explicitly set a region using the withRegion
methods, the SDK consults the default region provider chain to try and determine the region to use. One of the methods used is -
The AWS_REGION environment variable is checked. If it's set, that region is used to configure the client.
And in the case of Lambda -
This environment variable is set by the Lambda container.
Finally, to use default credential/region provider chain to determine the region from the environment, use the client builder's defaultClient method.
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
This is the same as using standard followed by build.
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();
AWS Documentation: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html
More details: How to fix "Unable to find a region via the region provider chain" exception with AWS SDK
PS: Above link goes to my personal blog that has additional details on this.