AWS Java SDK - Unable to find a region via the region provider chain
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.
Regarding Q1, try to build your client using the following syntax:
AmazonS3 amazonS3 = AmazonS3Client.builder()
.withRegion("us-east-1")
.withCredentials(new AWSStaticCredentialsProvider(creds))
.build();