CodePipeline + Beanstalk Connection Refused React + Express Apps

Viewed 510

I'll lay this out below in detail:

Goal

A React front-end game that uses socket.io to transfer game state data between players on the Express server.

Setup

After finding that it would be impossible/a real work-around to have both React/Express on an Amplify instance, I decided to move to CodePipeline + CodeDeploy to Beanstalk.

I have the Source coming from GitHub, a CodeBuild step, and then CodeDeploy. The CodeBuild should basically just compile based on my buildspec.yml below:

version: 0.2
  frontend:
    phases:
      preBuild:
        commands:
          - npm ci
      build:
        commands:
          - npm run build
   artifacts:
     baseDirectory: build
     files:
       - '**/*'
   cache:
     paths:

Although this is calling npm run build, which I'm not sure A) The CodeBuild/CodeDeploy will try to do with node start or B) If this will kick off my react-scripts build in package.json:

"scripts": {
    "webpack": "webpack --production",
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

I'm assuming I want it to build the webpack bundle in CodeBuild, then CodeDeploy will call the proper run command, but it seems black boxed? Is there another config file?

Runtime Errors

I get Connection Refused, although my server.js file defaults to localhost and 8080:

var hostname = process.env.IP || 'localhost';
var port = process.env.PORT || 8080;

Web.std.out.log:

Sep 20 18:10:10 ip-172-31-41-5 web: > MyApp@0.1.0 start /var/app/current
Sep 20 18:10:10 ip-172-31-41-5 web: > react-scripts start
Sep 20 18:10:12 ip-172-31-41-5 web: #033[34mℹ#033[39m #033[90m「wds」#033[39m: Project is running at http://172.31.41.5/
Sep 20 18:10:12 ip-172-31-41-5 web: #033[34mℹ#033[39m #033[90m「wds」#033[39m: webpack output is served from
Sep 20 18:10:12 ip-172-31-41-5 web: #033[34mℹ#033[39m #033[90m「wds」#033[39m: Content not from webpack is served from /var/app/current/public
Sep 20 18:10:12 ip-172-31-41-5 web: #033[34mℹ#033[39m #033[90m「wds」#033[39m: 404s will fallback to /
Sep 20 18:10:12 ip-172-31-41-5 web: Starting the development server...

Ngnix error.log: 2020/09/18 03:07:30 [error] 4436#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.40.133, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "172.31.41.5"

Lot of moving parts so I'm sure there are several missteps here, not sure which is which.

1 Answers

Based on the comments.

By default EB will look for package.json to run your application. If it is missing, and will use use script option in your package.json to start your application. For example, if you start sample node.js application that EB provides, the file is:

package.json

{
  "name": "Elastic-Beanstalk-Sample-App",
  "version": "0.0.1",
  "private": true,
  "dependencies": {},
  "scripts": {
    "start": "node app.js"
  }
}

If you don't provide package.json nor Procfile (other option, see below) EB will expect app.js or server.js to be present to start your application.

If you don't want to use package.json, you can also use Procfile to tell EB how to start your application.

When you don't provide a Procfile, Elastic Beanstalk runs npm start if you provide a package.json file. If you don't provide that either, Elastic Beanstalk looks for the file app.js or server.js, in this order, and runs it.

Example in your case could be

web: serve -s build
Related