Deploying React on Rails to Elastic Beanstalk

In order to deploy a React on Rails app to elastic beanstalk, you must install yarn on each instance. If yarn is not installed, asset compilation will fail on the elastic beanstalk instance.

You can install yarn by adding a 0x_install_yarn.config file to your .ebextensions folder which contains these commands.

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/09_yarn.sh" :
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      set -xe

      EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
      EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)
      EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
      EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)

      . $EB_SUPPORT_DIR/envvars
      . $EB_SCRIPT_DIR/use-app-ruby.sh

      # Install nodejs
      echo "install nodejs"
      curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -
      yum -y install nodejs
      echo "install yarn"
      # install yarn
      wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo;
      yum -y install yarn;

      # yarn install
      cd $EB_APP_STAGING_DIR
      yarn

      # mkdir /home/webapp
      mkdir -p /home/webapp
      chown webapp:webapp /home/webapp
      chmod 700 /home/webapp

This script installs yarn and all node.js dependencies before the rails do assets:precompile. Also, it creates /home/webapp directory allowing the precompile task to create temp files.

Your app can be deployed to elastic beanstalk successfully. However, the react app javascript files are under public/packs. If you are using nginx, you need to let it know the location of https://yourhost/packs.

In your proxy.conf setting, please add the following code.

...
server{
  ...
  location /packs {
    root /var/app/current/public;
  }
  ...
}
...

You can find an example code here: https://github.com/imgarylai/react_on_rails_with_aws_ebs.