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:

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()
    .withCredentials(new AWSStaticCredentialsProvider(creds))