Hosting multiple sub-domains from a single aws s3 bucket - amazon-web-services

Is it possible to host multiple subdomains from a single bucket folders?
Example -
Lets assume bucketname is my aws s3 bucket.
To access the site url is - http://bucketname.s3.amazonaws.com.
Now lets assume i have 5 folders inside it - a,b,c,d & e.
Can i create subdomains pointing to their respective folders inside the s3 bucket. Like -
http://a.bucketname.s3.amazonaws.com site works from folder a of the bucket
http://b.bucketname.s3.amazonaws.com site works from folder b of the bucket
http://c.bucketname.s3.amazonaws.com site works from folder c of the bucket
and so on.
Is it possible ?

Amazon S3 alone cannot do what you ask for.
The URL will point to only one bucket.
Typically, however, people want a Custom URL to point to content. For example, you could point mycompanyname.com to Amazon S3. This involves:
Owning the domain name
Creating a bucket with a name that matches the domain name (thus, you'd need one bucket per domain/subdomain)
Configuring the DNS entry (in Amazon Route 53 or your own DNS provider) to with a CNAME that points to the S3 bucket
Alternatively, behaviours can be configured in Amazon CloudFront that can present content from various back-ends.

Naming conventions for bucket URL are fixed by AWS. You cannot change to subdomain URL. You can use CloudFront to host it in your own domain or it can host under *.cloudfront.net.
Subdomain for cloudfront is also random. Will look like the following.
d3v7q0dqls688r.cloudfront.net
Hope it helps.

Related

Redirect directories to individual s3 buckets?

I have a Laravel application hosted on a domain. I have several dynamic directories ie:
example.com/directory
example.com/random
example.com/moon
I would like each of these directories to resolve to a different s3 bucket while masking the URL (I want to see the URL above, not the s3 bucket URL). What's the best way to accomplish this? I could possibly create a primary bucket and host example.com on it and create routing rules on that s3 bucket to redirect to the other s3 buckets (I think). What do those routing rules look like? I was unable to find directions in the AWS documentation that showed how to redirect to other buckets. Is there another, more simple way to go about this?
It's worth noting the Laravel application may not need to be involved in the actual routing as much as using the AWS sdk to dynamically configure the directories.
You have to use Route53 along with S3 enabling static website hosting.
For detail configuration about static website hosting in S3, you can take a look here.
After that choose Route53 as a service in AWS Console.
Select your hosted zone and add a CNAME recordset, in the value field enter the S3 bucket endpoint url and in the Name field enter the url that you want to point to the S3 bucket.
For using Route53 you can read this AWS document.
The best way would be to create a CloudFront (CF) distribution with three different origins. Then each origin would respond to different Origin Path which would lead to different buckets.
example.com could be defined in Route53, with Alias A record to the CF distribution. The benefit of using CF with S3 is that you not only can speed up your website (CF is CDN), but also you can keep your buckets and objects private:
Amazon S3 + Amazon CloudFront: A Match Made in the Cloud

Can I Use same AWS S3 bucket for 2 domains whilst using the cloudflare CDN

I am using AWS S3 bucket for storing and displaying the user upload image files.
My website name is example.net and as I want to use cloudflare CDN and show the image url path as images.example.net (as I want to mask the S3 url).
I created a S3 bucket with name images.example.net and mapped the CNAME images.example.net.s3.us-east-1.amazonaws.com as images.
So I am able to access the images using url images.example.net/myPic.jpg
Recently I got a new domain example.com (only the extension is different), and now I want to use the same S3 bucket example.net to store the files and the url needs to shown as images.example.com/myPic.jpg
If I create a new S3 bucket images.example.com , then I can do it, but I want to use the existing one only.
Is there any method to configure in cloudflare for that ?
Can I do it without creating a new bucket named images.example.com ?
If you're using virtual hosting then you're limited to a single domain per bucket by using the domain as the bucket name.
The only options available to you are:
Create a second S3 bucket with your other domain name as the CNAME
Create a CloudFront distribution in front of your S3 bucket and specify both domains as alternative domain names. Then on CloudFlare use the CloudFront CNAME. Disable all caching to allow CloudFlare to handle all the CDN functionality.
Obviously neither are ideal for your scenario, however these are the options available at this time.

What is the best way to point domain to a S3 bucket that doesnt have the domain as bucket name

I'm new to AWS and all of it's services and my first go at it I started my project with a S3 bucket that was created by default by AWS Vue CLI. I've got Cognito pool & gateway API connected to this bucket but now that I want to connect this project to a custom domain I just purchased I realize the bucket name needs to match the root domain name. From what I understand this will mean that I need to pull all non-aws files from my Vue project, duplicate it, and either reconfigure pre-existing connections or start all over.
I've got my custom domain set up with an empty S3 bucket, Cloudfront, and Router 53 so that's up and working but now I am not sure how to go about transferring this project from buckets.
So basically I started my project with Bucket1 and finished everything that included Cognito Pool & Gateway API. Now I have a custom domain I want to use have Cloudfront and Route 53 with CustomDomain bucket name and I want to have the project from Bucket1 load for the new bucket.
Using Cloud-front you can mitigate this issue.
Route 53(DNS Name) --> Cloudfront Url --> S3 origin
As you already created a bucket for website hosting, below steps can help you.
Use the Amazon S3 console t to login and search for CloudFront.
Click on Create distribution
Create a Web distribution
Select existing bucket in Origin Domain Name and complete the setup.
Update the DNS records for your domain to point your website's CNAME to your CloudFront distribution's domain name. You can find your distribution's domain name in the CloudFront console in a format that is similar to d1234abcd.cloudfront.net.
Wait for your DNS changes to propagate and for the previous DNS entries to expire.
The typical AWS way to do this is to use cloudfront - the domain points to cloudfront and cloudfront can point to any bucket name or other source location; when you introduce cloudfront into the mix, the bucketname no longer needs to match the domain name.

have multiple subdomains refer to the same S3 bucket without HTTP redirect

I have a bucket called subdomain.domain.com that hosts code that should be used whenever users go to various subdomains.
e.g. going to:
- a.domain.com
- b.domain.com
- c.domain.com
Should go to the same bucket.
I've set the CNAME for all the subdomain URL's to go to the URL of the subdomain.domain.com bucket. The problem is that, AWS tries to look for bucket a.domain.com' instead of just going tosubdomain.domain.com' bucket
I've read some suggestions saying I can create a bucket like a.domain.com and have it redirect back to subdomain.domain.com but I don't want a URL change and I'd like to be able to upload just to one bucket and all subdomains will be updated.
Some features that appear to be "missing" in S3 are actually designed into CloudFront, which complements S3. Pointing multiple domain names to a single bucket is one of those features. It isn't possible to do this with only S3 since, as you noticed, S3 matches the hostname with the bucket name.
Create a CloudFront distribution, defining each of the desired domain names as Alternate Domain Names.
For the origin server, type in the web site endpoint hostname of the bucket, found in the S3 console. (Don't select the bucket from the dropdown list).
Point the various hostnames to CloudFront in DNS.
CloudFront will translate the incoming hostnames so that S3 serves all the domains from a single bucket, the one you specified as the origin server.
Note that this configuration also allows you to optionally use SSL with your web hosting buckets, which is another feature that S3 relies on CloudFront to implement.

How to Alias a Domain Name or Sub Domain to Amazon S3 - Present images from subdomain

I have a bucket on Amazon s3 which contains some jpeg images. For SEO purposes I want to serve my images from my subdomain like http://images.example.com
Currenly my bucket name does not looks like a subdomain. It only contains a dash like my-images
In this article, author says: Create a bucket which looks like a subdomain.
So can I alias my subdomain with CNAME record with this bucket name?
Also this solution support author's idea: https://stackoverflow.com/a/18766082/1848929
Must I rename my bucket? Is it possible to rename a bucket?
Your bucket name must match the CNAME (Or Alias) record you point to the bucket.
The bucket name must be the same as the CNAME
http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html
It is not possible to rename a bucket. In the other answer you referenced, I suspect this was a casual use of the word "rename," which actually was intended to mean "create a bucket with a different name," because:
After you create a bucket, you cannot change its name.
http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html
So, to point a DNS entry from one of your domains directly at a bucket, you will need a bucket with a matching name.
There is one alternative, however, which does not require you to change the name of the bucket, which might be a good idea anyway: you can use the CloudFront CDN in front of your bucket.
If you create a CloudFront distribution, you can tell CloudFront which DNS names you intend to point to it, and then configure CloudFront to serve the requests from a bucket you specify -- and in this case, the name of the bucket no longer matters, because CloudFront handles the hostname-to-bucket mapping automatically.
This further gives you the potential performance enhancement of caching your image assets closer to frequent visitors of your site, and allows you to use SSL with your subdomain as the hostname (using a free SSL cert from Amazon Certificate Manager) which is only possible with CloudFront+S3, not S3 alone.
You need to create a bucket with the name images.example.com
Then you will need to CNAME it in your DNS.
images.example.com -> images.example.com.s3.amazonaws.com.
Is it possible to rename a bucket?
No, you can't change the name of the bucket once it has been created. The workaround is to create a new bucket and copy the files to it.