Deploying this Hugo blog to AWS S3 | Part 2
After a few months, i would like to make some minor changes to the infrastrucutre of the site. In this chapter we’ll see how do i use my CloudFront distribution to restrict access to Amazon S3 bucket.
Best Practise: Create a Cloud Front origin access control (OAC)
- Block public access to your S3 bucket
- Select one of your S3 bucket and go to
Permissiontab. - Turn on
block all public access
- Open the CloudFront console
- From the list of distribution, choose the distribution that serves content from the S3 bucket that you want to restrict access to.
- Choose the
Origintab. - Select the S3 origin, and then choose
Edit. - Select the S3 endpoint as
Origin Domain–> The S3 endpoint must be in the format $S3-Bucket-name.s3.eu-central-1.amazonaws.com - For
Origin Access, selectOrigin access control settings (recommended). - In the dialogue box, name your control setting. It’s a best practice to keep the default setting as
Sign requests (recommended). Then, choose Create. - For
S3 bucket Access, apply the bucket policy on the S3 bucket. SelectCopy policy, and then select Save. - Select
Go to S3 bucket permissionsto take you to the S3 bucket console. - Select
Save Changes. - In the Amazon S3 console, from your list of buckets, choose the bucket that’s the origin of the CloudFront distribution.
- Choose the
Permissionstab. - Under Bucket Policy, confirm that you see a statement similar to the following:
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::$BucketName/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::$accountID:distribution/$distributionID"
}
}
}
]
}
You must add the preceding statement to allow CloudFront OAC to read objects from your bucket.
- Add your default root object
- From the list of distribution, choose the distribution that serves content from the S3 bucket that you want to restrict access to.
- Choose the
GeneralSetting. - Add the default root object under the option
Deafult root object. CloudFront will return a specific object when a user requests the root URL for the distribution.
We’ll use CloudFront Function to set a default root object for subdirectories on our statically hosted website.
Specifically, www.example.com/subdir/index.html will be served whenever the user asks for www.example.com/subdir.
- Create CloudFront Function
- Open the CloudFront console
- Go to
Functionsand create a new record. - In the
Function Codecreate a simple JavaScript function:
'use strict';
function handler(event) {
var request = event.request;
var uri = request.uri;
// Check whether the URI is missing a file name.
if (uri.endsWith('/')) {
request.uri += 'index.html';
}
// Check whether the URI is missing a file extension.
else if (!uri.includes('.')) {
request.uri += '/index.html';
}
return request;
}
- From the list of distribution, choose the distribution that serves content from the S3 bucket that you want to restrict access to.
- Choose the
Behaviorstab. - Under
Additional settingsadd your CloudFront function asViewer request.
- Save changes.