Skip to main content

Publish your Koriander blog with S3 and CloudFront

Published: August 30, 2026

In this tutorial, we'll walk through all the steps needed to set up your own Koriander CMS blog on Amazon S3 and CloudFront.

Here's what we'll do in this tutorial:

  1. Install Koriander CMS and make your first page.
  2. Create the AWS resources needed to upload your site.
  3. Configure Koriander to upload your site.

Install Koriander CMS

First you're going to install Koriander CMS on our computer using pipx.

Install pipx using the official pipx installation instructions. Open a terminal on your computer and make sure that you can run pipx by typing the following command and pressing the Enter key:

pipx --version

pipx version on the author's computer
pipx version on the author's computer Open in new tab (full image size 38 KiB)

On the author's computer this command prints the following:

1.8.0

If you see pipx printing a version number like 1.8.0, you're ready to install Koriander CMS on your computer. Type the following command and press the Enter key:

pipx install koriander

Install Koriander CMS with pipx install koriander
Install Koriander CMS with pipx install koriander Open in new tab (full image size 47 KiB)

When pipx finishes installing Koriander CMS, pipx install koriander prints the following:

  installed package koriander 0.18.0, installed using Python 3.13.13
  These apps are now globally available
    - koriander
done! ✨ 🌟 ✨

The version numbers Koriander CMS 0.18.0 and Python 3.13.13 may be different when you install Koriander CMS.

Launch Koriander CMS

Now that you've installed Koriander CMS, you're ready to launch it from your terminal. In a fresh terminal window, type the following command and press Enter:

koriander

When you launch Koriander CMS, your browser should automatically open the index page. If your browser doesn't open the index page, copy the green address below the Log in with the following link: line and paste it into your browser address bar:

Koriander CMS prints a log in link that you can open in your browser
Koriander CMS prints a log in link that you can open in your browser Open in new tab (full image size 129 KiB)

The next picture shows the Koriander CMS index page at /index.html. Press the Edit link in the top toolbar to edit the page contents:

Koriander CMS automatically opens in your browser
Koriander CMS automatically opens in your browser Open in new tab (full image size 92 KiB)

Edit the index page

You've opened the page editor for the index page. In Koriander, pages use Markdown for formatting. Here's the default index page content when you've just installed Koriander:

Edit the page using the Edit page link
Edit the page using the Edit page link Open in new tab (full image size 131 KiB)

Add your own page content on the left side of the Markdown editor:

Add your own text to customize the index page
Add your own text to customize the index page Open in new tab (full image size 104 KiB)

Save your changes by pressing the Save button in the right menu under Publish:

Save your changes by pressing the Save button
Save your changes by pressing the Save button Open in new tab (full image size 110 KiB)

Go back to the start page by pressing the View on site link in the right menu under Publish.

Follow the View on site link under Publish
Follow the View on site link under Publish Open in new tab (full image size 107 KiB)

Review your changes

Let's check that your index page changed. This screenshot shows how the index page looks like when the default index page content has changed:

After pressing the Save button, the index page at /index.html now shows your changes.
After pressing the Save button, the index page at /index.html now shows your changes. Open in new tab (full image size 80 KiB)

You're ready to set up your AWS resources

Set up AWS resources

In this section we'll set up these AWS resources:

Let's start with the Amazon S3 bucket.

S3 Bucket

Create an Amazon S3 bucket in your preferred AWS zone6. First, go to the Amazon S3 buckets page in the AWS console:

Go to Amazon S3 from the AWS console start page
Go to Amazon S3 from the AWS console start page Open in new tab (full image size 118 KiB)

On the Buckets overview page, press the orange Create bucket button:

Press Create bucket to start creating a bucket
Press Create bucket to start creating a bucket Open in new tab (full image size 53 KiB)

Enter a name for your bucket in the following Create bucket screen:

Enter your desired bucket name under Bucket name
Enter your desired bucket name under Bucket name Open in new tab (full image size 59 KiB)

Scroll down and finish creating your bucket by pressing the Create bucket button:

Press Create bucket to finish creating your bucket
Press Create bucket to finish creating your bucket Open in new tab (full image size 63 KiB)

Let's check that you've created your bucket by going back to the Buckets overview in the Amazon S3 console. You should see your newly created bucket right here:

When you create your bucket, it should show up in the Buckets overview in the Amazon S3 console
When you create your bucket, it should show up in the Buckets overview in the Amazon S3 console Open in new tab (full image size 75 KiB)

CloudFront Distribution

Now that you've created your Amazon S3 bucket you need a CloudFront distribution to make the S3 bucket contents publicly available. Go to CloudFront in the AWS console.

Select CloudFront in the AWS services menu
Select CloudFront in the AWS services menu Open in new tab (full image size 113 KiB)

Press the orange Create distribution button to start creating your CloudFront distribution:

Press Create distribution
Press Create distribution Open in new tab (full image size 45 KiB)

Give your CloudFront distribution a name and press Next. In this example, the distribution name is “koriander-cloudfront”:

Enter a Distribution name and press Next
Enter a Distribution name and press Next Open in new tab (full image size 75 KiB)

On the next Specify origin screen, make sure that you select Amazon S3 as Origin type and press the blue Browse S3 button:

Select Amazon S3 as Origin type and press Browse S3
Select Amazon S3 as Origin type and press Browse S3 Open in new tab (full image size 77 KiB)

Select your bucket in the S3 Origin popup and confirm with Choose:

Select your bucket and confirm your choice by pressing Choose
Select your bucket and confirm your choice by pressing Choose Open in new tab (full image size 53 KiB)

On the next Enable security screen, select Do not enable security protections8, which is enough for just testing CloudFront, and press the Next button:

Press Next after choosing Do not enable security protections .
Press Next after choosing Do not enable security protections. Open in new tab (full image size 40 KiB)

Finish creating your CloudFront distribution by pressing Create distribution on the next screen:

Press Create distribution after reviewing the new CloudFront distribution details
Press Create distribution after reviewing the new CloudFront distribution details Open in new tab (full image size 81 KiB)

After you press Create distribution, the AWS console should show you your new CloudFront distribution.

Notice the Distribution domain name ending on “cloudfront.net”. This is where you can access your Koriander site once you've finished uploading it to your S3 bucket.

The AWS console shows Successfully created distribution
The AWS console shows Successfully created distribution Open in new tab (full image size 53 KiB)

Finally, let's up a root object for your CloudFront distribution. Press the Edit button next to Settings. Enter “index.html” under Default root object - optional. Scroll down and press Save changes.

In your distribution settings, enter index.html under Default root object - optional
In your distribution settings, enter index.html under Default root object - optional Open in new tab (full image size 127 KiB)

You're ready to create an IAM user.

Configure an IAM user for your Amazon S3 bucket

In this section you'll create an IAM user to let Koriander access your Amazon S3 bucket. 7

Go to the Identity and Access Management (IAM) console in your AWS account.

Find the IAM entry in the AWS services menu
Find the IAM entry in the AWS services menu Open in new tab (full image size 126 KiB)

Start creating a user for your newly created S3 bucket by pressing the Create user button:

Press Create user to create a IAM user
Press Create user to create a IAM user Open in new tab (full image size 65 KiB)

Choose a user name and enter it in the User name field. In this example, the user name is “koriander-bucket-user”. Press Next to continue to the Set permissions screen.

Enter a user name and press Next
Enter a user name and press Next Open in new tab (full image size 55 KiB)

Create a policy for your IAM user

On the Set permissions screen, select Attach policies directly under Permissions options and press the blue Create policy button:

Select Attach policies directly and then press Create policy
Select Attach policies directly and then press Create policy Open in new tab (full image size 72 KiB)

This opens a new window. In the Policy editor, enter the following policy 3 while adjusting the “koriander-bucket” name for the bucket name that you've chosen:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::koriander-bucket"]
        },
        {
            "Sid": "AllObjectActions",
            "Effect": "Allow",
            "Action": ["s3:*Object"],
            "Resource": ["arn:aws:s3:::koriander-bucket/*"]
        }
    ]
}

Here's what it should look like when you enter your user policy. Press Next to continue creating your IAM policy:

Paste the policy and make sure to adjust the bucket name. Press Next to continue
Paste the policy and make sure to adjust the bucket name. Press Next to continue Open in new tab (full image size 80 KiB)

On the next Review and create screen, enter a name for the policy and press Create policy:

Enter a Policy name and press Create policy
Enter a Policy name and press Create policy Open in new tab (full image size 105 KiB)

When you press Create policy, IAM takes you to the Policies screen and you should see the follow green confirmation message:

Policy koriander-bucket-policy created

The AWS console shows you a success message Policy … created when you create your policy. You can close this window.
The AWS console shows you a success message Policy … created when you create your policy. You can close this window. Open in new tab (full image size 72 KiB)

Close this Policies window and go back to the IAM user creation screen.

Press the refresh button in the policy selector next to the Create policy button. Attach the “koriander-bucket-policy” to the IAM user by selecting it in the following list and pressing Next:

Press the refresh button, filter policies by Customer managed , select your policy, and press Next
Press the refresh button, filter policies by Customer managed, select your policy, and press Next Open in new tab (full image size 81 KiB)

Finish creating your user by pressing the orange Create user button:

Finish creating your IAM user and press Create user
Finish creating your IAM user and press Create user Open in new tab (full image size 63 KiB)

Create an access key for your IAM user

You should now see your new “koriander-bucket-user” in the list of IAM users:

You should now see your new user in the IAM users list. Select your user to create an access key
You should now see your new user in the IAM users list. Select your user to create an access key Open in new tab (full image size 65 KiB)

Open your IAM user by pressing on its underlined blue link. In this example the IAM user has the name “koriander-bucket-user”. When you're on your IAM user's page, select the Security credentials tab and press Create access key.

Select the Security credentials tab and press Create access key
Select the Security credentials tab and press Create access key Open in new tab (full image size 155 KiB)

This takes you to the Access key best practices & alternatives screen. Select Other1 as your use case on the next screen and press Next:

Select Other and press Next
Select Other and press Next Open in new tab (full image size 147 KiB)

You should now be on the Set description tag - optional screen. Enter a description for your IAM user's access key and press Create access key:

Enter an access key description in the Description tag value field and press Create access key
Enter an access key description in the Description tag value field and press Create access key Open in new tab (full image size 89 KiB)

On the next screen, press the Download .csv file button to download your access key:

Press Download .csv file to download your access key details
Press Download .csv file to download your access key details Open in new tab (full image size 28 KiB)

Go to your IAM user's page and select the Security credentials tab again. Confirm that your access key is there. It should say "Active" under Status as you can see here:

This is what you should see when you've created your access key
This is what you should see when you've created your access key Open in new tab (full image size 10 KiB)

Open the .csv file that you've just downloaded. It contains the data for the access key that you've just created. Notice the two columns, Access key ID and Secret access key:

The .csv file contains your access key details
The .csv file contains your access key details Open in new tab (full image size 76 KiB)

You're going to use the Access key ID and Secret access key in the next step.

Configure S3 uploads in your Koriander CMS site

You've set up everything you need on AWS and you're ready to configure Koriander to upload your newly created site to S3 and publish it with CloudFront. In this section you're going to add your IAM user's access key to Koriander.

Open Koriander in your browser again if you've closed it. You can click the green log in link from the beginning of this tutorial to open it again. On the index page, go to the administration screen by selecting the Admin link in the toolbar:

Follow the Admin link in the Koriander CMS toolbar
Follow the Admin link in the Koriander CMS toolbar Open in new tab (full image size 81 KiB)

In the administration screen, select the Site settings link in the Koriander CMS table.

Under Koriander CMS follow the Site settings link
Under Koriander CMS follow the Site settings link Open in new tab (full image size 109 KiB)

Select the grey S3 upload link next to the Change Site settings title.

Next to Change Site settings press S3 upload
Next to Change Site settings press S3 upload Open in new tab (full image size 116 KiB)

On the next Upload to S3: Select storage type screen, select AWS S3 under S3 endpoint type and press Continue:

Select AWS S3 and press Continue
Select AWS S3 and press Continue Open in new tab (full image size 111 KiB)

Select your AWS region in the next screen. The bucket in this tutorial belongs to the “ap-southeast-2”2 AWS region. If you're not sure what AWS region your bucket belongs to, go to the Buckets overview in the Amazon S3 console and look at the AWS region field:

This S3 bucket is in the ap-southeast-2 AWS region as you can see in the field next to the S3 bucket name
This S3 bucket is in the ap-southeast-2 AWS region as you can see in the field next to the S3 bucket name Open in new tab (full image size 78 KiB)

Press the Continue button to confirm your AWS region choice:

Select your AWS region and press Continue
Select your AWS region and press Continue Open in new tab (full image size 102 KiB)

On the next screen, enter your S3 bucket, S3 access key ID and S3 access key. Under S3 bucket, enter the name of the bucket that you've just created. For S3 access key ID and S3 secret access key, enter the two values from the .csv file that you've downloaded. Press Continue to confirm:

Enter your S3 bucket name , Access key ID , Access key , and press Continue
Enter your S3 bucket name, Access key ID, Access key, and press Continue Open in new tab (full image size 112 KiB)

You're ready to upload your site to S3 and publish it with CloudFront.

Upload to Amazon S3

Pressing Continue should take you to the Upload to S3 screen. Select Dry run5 and press Upload.

Select Dry run and press Upload
Select Dry run and press Upload Open in new tab (full image size 112 KiB)

Koriander CMS now tells you which files it would upload to your Amazon S3 bucket, but hasn't yet uploaded since it's a Dry run:

After the Dry run , Koriander shows you which files it would upload
After the Dry run, Koriander shows you which files it would upload Open in new tab (full image size 137 KiB)

Press Upload now to upload your Koriander CMS site to your Amazon S3 bucket. This takes you to a results page:

Press Upload now to upload your site
Press Upload now to upload your site Open in new tab (full image size 107 KiB)

Check your newly uploaded site

Confirm that you've uploaded your file to your Amazon S3 bucket by opening your bucket in the AWS Console and selecting the Objects tab:

Open your bucket in the AWS console and select the Objects tab to view your uploaded files.
Open your bucket in the AWS console and select the Objects tab to view your uploaded files. Open in new tab (full image size 139 KiB)

Go to your CloudFront distribution. You should see the Last modified field updating. Note the “…cloudfront.net” Distribution domain name:

The Last modified field in your CloudFront distribution should update
The Last modified field in your CloudFront distribution should update Open in new tab (full image size 27 KiB)

Now open the “…cloudfront.net” Distribution domain name in your browser. You should see your own Koriander CMS site appear:

Open the "…cloudfront.net" Distribution domain name in your browser
Open the "…cloudfront.net" Distribution domain name in your browser Open in new tab (full image size 85 KiB)

You have just published your Koriander Site using Amazon S3 and CloudFront.

Here are some more things that you can do:


  1. For local tools, AWS advises you to use an "Integrated Development Environment which supports the AWS Toolkit", which isn't realistic for Koriander to support at the moment. Further, the Learn more link directs you to a generic landing page with tools for vibecoded projects that doesn't explain how one should go ahead and integrate this into the Koriander CMS. If anything, AWS does their users a disservice by not providing a safer escape hatch that works for local tools. Surely they could also make it easier to add automatic expiry to access keys. 

  2. The AWS console lists "ap-southeast-2" as "Asia Pacific (Sydney)". You can see the region name in the console address. Example: http://ap-southeast-2.console.aws.amazon.com/s3/buckets. The Amazon S3 documentation also has a page documenting S3 endpoint names

  3. Grant read and write access to Amazon S3 bucket objects further describes this policy. 

  4. When you open your bucket to the public, anyone can read anything inside the bucket. Be sure you use this bucket only for hosting your Koriander site. You may want to place AWS Cloudfront before the S3 bucket to avoid having to make this bucket public. 

  5. When Koriander performs a Dry run, it checks which files in your site have changed or which ones you've added or removed. You can always try a Dry run if you're not sure what changes. 

  6. Visit the Creating a general purpose bucket tutorial for more information on how to create an Amazon S3 bucket. 

  7. Find more information in the Create an IAM user in your AWS account tutorial on docs.aws.amazon.com if you're not sure how to continue. 

  8. You may want to revise these settings later. Learn how to here 

Tags

I would be thrilled to hear from you! Please share your thoughts and ideas with me via email.

Back to Index