54

I am having some trouble figuring out how to access a file from Amazon S3. Lets say that the bucket that the file lives in is BUCKET_NAME, the file is FILE_NAME, etc. I have tried the following two URLs:

https://s3.amazonaws.com/BUCKET_NAME/FILE_NAME/
?Expires=EXPIRATION
&Signature=SIGNATURE
&SignatureVersion=2
&SignatureMethod=HmacSHA1
&AWSAccessKeyId=KEYID

But this gives me the following error:

<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>

I have also tried:

https://s3.amazonaws.com/BUCKET_NAME/
?Key=FILE_NAME
&Expires=EXPIRATION
&Signature=SIGNATURE
&SignatureVersion=2
&SignatureMethod=HmacSHA1
&AWSAccessKeyId=KEYID

but this returns a webpage with a list of all of the files in the given bucket (including FILE_NAME), instead of the specific file I want. I have also tried throwing in Action=GetObject into the URL as well but that doesn't seem to change anything.

It would be helpful to find out which (if any) is the proper method and what I am doing wrong. I have been digging through Amazon's documentation for a while now but I can't seem to sort it out.

John Rotenstein
  • 241,921
  • 22
  • 380
  • 470
user1018928
  • 551
  • 1
  • 4
  • 5
  • 1
    for programmers looking. thought i would add this http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html – dibble Dec 11 '15 at 15:22

6 Answers6

72

Its actually formulated more like:

https://<bucket-name>.s3.amazonaws.com/<key>

See here

stevebot
  • 23,275
  • 29
  • 119
  • 181
35

Documentation here, and I'll use the Frankfurt region as an example.

There are 2 different URL styles:

But this url does not work:

The message is explicit: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

I may be talking about another problem because I'm not getting NoSuchKey error but I suspect the error message has been made clearer over time.

siberiancrane
  • 586
  • 1
  • 6
  • 20
Sebastien Lorber
  • 89,644
  • 67
  • 288
  • 419
  • 5
    Path style URLs are deprecated. AWS will drop support for them at some point in the future. See https://aws.amazon.com/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/ – oxley Jan 25 '21 at 19:00
20

Perhaps not what the OP was after, but for those searching the URL to simply access a readable object on S3 is more like:

https://<region>.amazonaws.com/<bucket-name>/<key>

Where <region> is something like s3-ap-southeast-2.

Click on the item in the S3 GUI to get the link for your bucket.

orlade
  • 2,060
  • 4
  • 24
  • 35
3

As @stevebot said, do this:

https://<bucket-name>.s3.amazonaws.com/<key>

The one important thing I would like to add is that you either have to make your bucket objects all publicly accessible OR you can add a custom policy to your bucket policy. That custom policy could allow traffic from your network IP range or a different credential.

Chad Van De Hey
  • 2,716
  • 3
  • 29
  • 46
1

Note that if you're in a different AWS partition, such as US GovCloud or China then you'll have a slightly different URL pattern.

https://<bucket-name>.s3-<region-name>.amazonaws.com/<key> works for GovCloud.

China is something like https://<bucket-name>.s3-<region-name>.amazonaws.com.cn/<key>.

jgibson
  • 1,013
  • 11
  • 9
0

The date is 08.03.23 and the current way to format the url is this:

https://<bucket>.s3.<region>.amazonaws.com/<key>
Robert Rendell
  • 1,658
  • 15
  • 18