5

Can someone please provide information on how to deploy Strapi to AWS Elastic Beanstalk?

I have found many resources on how to deploy Strapi on many other different platforms such as Digital Ocean and Heroku, but I am very curious about deploying Strapi to Elastic Beanstalk. Is that possible and how can I do with that?

portatlas
  • 657
  • 6
  • 12
Rizky Arifin
  • 51
  • 1
  • 2

3 Answers3

11

First you need an EBS application & environment (Web Server) running Node version 12 (as of now). You'll also need to change the package.json in your Strapi project and update the engines part, like this (major version must match EBS Node version):

"engines": {
  "node": "12.X.Y", // minor (X) & patch (Y) versions are up to you
   ...
},

You must switch your project to use NPM instead of Yarn (EBS currently only supports NPM out-of-the-box), to do this I recommend a tool like synp.

Then create a Procfile which will describe how you want EBS to run your app:

web: npm run start

Then to deploy manually, you could first (in the project root) run npm install, then npm run build to build the Strapi Admin (React) application. After the Strapi Admin has been built, make sure to remove the node_modules folder, because EBS will automatically install dependencies for you. (*)

Last step is to zip the whole project (again, in project root, run: zip -r application.zip .), upload the zip to AWS EBS & let it do it's magic. Hopefully it should then install dependencies and start your application automatically.


Side note: When using some specific dependencies in your project (one example is sharp), the EBS may fail to install your dependencies, to fix this, add a .npmrc file to your project root with the following contents:

unsafe-perm=true

Side note #2: You need to set some environment variables in the EBS configuration panel in order for Strapi to work (like database credentials etc.).


(*) Although you could include node_modules in your app and zip it and upload to EBS (which could work), sometimes zipping node_modules may break some dependencies, so I recommend removing it and let EBS install dependencies for you.

richardszegh
  • 121
  • 2
  • 6
  • 1
    **"unsafe-perm=true" is not working anymore with Node 16 and Strapi v4**, because it can't install the Sharp package. You need to perform permission updates in platform hooks according to this answer: https://github.com/lovell/sharp/issues/3221#issuecomment-1126528844 – NKol Jul 14 '22 at 15:34
4

If you want to deploy Strapi on Elastic Beanstalk with AWS CodePipeline the following steps worked for me:

  1. Navigate to Elastic Beanstalk and Create a new application with the corresponding Node version for the application

    • Platform: Node.js
    • Platform Branch: Node.js 12 funning on 64bit Amazon Linux 2
    • Platform Version: 5.4.6
    • Select Sample Application to start (we will connect this to AWS CodePipeline in a later step)
  2. Set up the code repository on GitHub (if one doesn’t already exist)

  3. Navigate to AWS CodeBuild and select create build project

    • In the Source Section connect to your Github Repository

    • In the Environment Section select the following configurations

      • Environment Image: Manage image

      • Operating System: Ubuntu

      • Runtimes: Standard

      • Image: aws/codebuild/standard:5.0

      • Role name: AWS will create one for you

    • Buildspec

      • Select “Use a buildspec file” - We will have to add a buildspec.yml file to our project in step 4
    • Leave the other default settings and continue with Create build project

  4. Update your Strapi Code

    • Add the Procfile, .npmrc, and update the package.json file accordingly as suggested by Richárd Szegh

    • Add the .ebignore file for Elastic Beanstalk

    • Add the following buildspec.yml and .ebignore file into your project

buildspec.yml

version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 12

  pre_build:
    commands:
      - npm install
  
  build:
    commands:
      - npm run build

  post_build:
    commands:
      - rm -rf node_modules

artifacts:
  files:
    - '**/*'

.ebignore

# dependencies
node_modules/
# repository/project stuff
.idea/
.git/
.gitlab-ci.yml
README.md
# misc
.DS_Store
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
# non prod env files
.env.development
.env.test
  1. Navigate to AWS CodePipeline

    • Click Create pipeline

    • Pipeline Settings

      • Pipeline name: Name accordingly
      • Service role: New Service Role
      • Role name: AWS will create a default name for you
    • Source Stage:

      • Connect to your repository in this case GitHub (Version 2)
      • Connect To Github
      • Repository Name: select repository accordingly
      • Branch Name: select branch accordingly
    • Build Stage:

      • Build Provider: AWS CodeBuild
      • Region: Select the region where the initial created the CodeBuild project Step 3
      • Project Name: Select the CodeBuild project you created
      • Environment Variables: Add any environment variables
    • Deploy Stage:

      • Deploy Provider: AWS Elastic Beanstalk
      • Region: Select the region where you initially created the EB
      • Application name: Select the Application Name you created in Step 1
      • Environment name: Select the Environment Name you created in Step 1
    • Create pipeline

  2. Now you can push changes to the repository and CodePipeline will pick up the changes, run the build, and deploy to Elastic Beanstalk

portatlas
  • 657
  • 6
  • 12
1

This seem to work for me, AWS Elastic Beanstalk t3.small instance, I wanted to use Free tier t3.micro but it didn't work for me, it seems t3.micro 1GB memory was not enough, t3.small had 2GB memory.

1) added deploy to scripts package.json

"scripts": {

    "deploy": "NODE_ENV=production npm run build && NODE_ENV=production npm run start"
  },

create file .npmrc and add:

unsafe-perm=true

Create Procfile and add:

web: npm run deploy
  1. I used AWS Pipeline to trigger EB deploy when I push update to Bitbucket (I can also disable Pipeline if not used to save $$$)
  2. I used AWS RDS PostgreSQL Free tier, the latest version of PostgreSQL didn't have the Free tier version but previous version did have the Free tier option checkbox to select it
  3. I used AWS S3 bucket to store images
atazmin
  • 4,757
  • 1
  • 32
  • 23