I'm writing an Amazon S3 client that might potentially access buckets in different regions. Our IT department is fairly strict about outgoing HTTP, and I want to use path-style access for this client to avoid having to make firewall changes for each new bucket.
My client uses the java SDK v1.4.4.2. As a test, I created a bucket in Singapore, then took a working S3 unit test that lists objects, and changed it to use path-style access:
AmazonS3 client = new AmazonS3Client(environ);
client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
When I run the unit test with this version of the client, all S3 accesses fail with the error that I have to set the right endpoint.
My question is, do I have to add the logic to look up the bucket's region and set that for the client? Or can the SDK be set to do that on its own? It seems the SDK should be able to do this automatically, since the function to look up a bucket's location is in there.
As a side issue, are there any particular performance issues with using path-style access? I presume it's just an extra round trip to query the bucket's location if I don't already know it.
Amazon S3 creates buckets in a Region that you specify. To optimize latency, minimize costs, or address regulatory requirements, choose any AWS Region that is geographically close to you.
The SDK does not have a default Region. To specify a Region: Set the AWS_REGION environment variable to the default Region. Set the region explicitly using config.
AWS clients created by using the client constructor will not automatically determine region from the environment and will, instead, use the default SDK region (USEast1). When running on Amazon EC2 or Lambda, you might want to configure clients to use the same region that your code is running on.
If you need the client to access objects in different region, you probably want to use the option:
AmazonS3ClientBuilder builder.withForceGlobalBucketAccessEnabled(true)
to build your client... See the s3 client builder documentation
this with ensure successful requests even if the client default region is not the same as the bucket/object targeted.
Also, if you need to get the bucket "mybucketname" exact end-point, you can use (headBucketResult ref page):
s3client.headBucket(HeadBucketRequest("mybucketname")).getBucketRegion()
As stated in the documentation, The path-style syntax, however, requires that you use the region-specific endpoint when attempting to access a bucket. In other words, with path style access, you've to tell to the SDK in which region is the bucket, it doesn't try to determine it on its own.
Performance wise, there should not be a difference.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With