Skip to content
Continuous deployment assistance for S3 + CloudFront environments
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
media 🎨 readme updates Jun 29, 2017
.gitignore 🔧 ignoreing yarn.lock Jul 19, 2017
demo.gif 🎨 readme updates Jun 29, 2017
index.js 🐛 proper copy for when not removing previous bucket Mar 21, 2019
license initial checkin Jun 19, 2017
package.json 1.1.6 Mar 21, 2019 🎨 doesnt actually use nuxt itself Aug 5, 2018

Aeonian Logo


Continuous Deployment for your AWS S3 + CloudFront environments

still in early development

npm version GitHub issues GitHub license CircleCI Join the chat at


I've built this to help supply a continuous delivery git-flow workflow hosted on an AWS serverless setup

What does this do?

Running .deploy('{environment}') will do the following:

  1. Create a new S3 bucket {prefix}-{commit-hash}-{environment} based on the current repo and config
  2. Upload the contents of a local directory you specified as localDir
  3. Configure the newly created bucket as a static website
  4. Change the origin of the CloudFront ID associated to point to our new bucket's website URL
  5. Initiate an invalidation on * making the Distribution pull the new bucket's content
  6. Delete the previous bucket that was assigned as the origin as to not leave a trail of buckets


Let's say you have a script operations/aeonian.js with the following

  bucket: {
    localDir: './dist/',
    prefix: 'mysite-'
  website: {
    index: 'index.html',
    error: 'error/index.html',
  environments: {
    staging: 'CLOUDFRONT_ID',
    production: 'CLOUDFRONT_ID',

Running node operations/aeonian.js staging this would result in

Aeonian Demo

Which would deploy ./dist/ to your S3+CF staging environment


  • Install the aeonian package npm install aeonian or yarn add aeonian
  • Set the current environment variables to your AWS key and secret for the AWS JS SDK
    • Other options on this step can be found here

CircleCI Integration

This is mostly why aeonian exists, to deploy based on commits. Based on the example above, lets say you have the above script operations/aeonian.js in your repo. you could then add the following to your package.json

"scripts": {
  "staging": "node operations/aeonian.js staging",
  "production": "node operations/aeonian.js production",

After setting your AWS credentials on CircleCi, you could add something like this to your circle.yml

    branch: staging
      - npm run staging
    branch: master
      - npm run production
  • Any commit/PR merge to the staging branch would deploy the staging environment
  • Any commit/PR merge to the master branch would deploy the production environment

Nuxt.js Integration

The main reason I built aeonian is for my all of my Nuxt.js projects. I have the following commands in my package.json that I have CircleCI run based on environment

  "scripts": {
    "production": "yarn generate; node operations/aeonian.js production",
    "staging": "yarn generate; node operations/aeonian.js staging",
You can’t perform that action at this time.