'Elastic Beanstalk cannot find the server.js file

I'm trying to deploy my Angular application through GitHub Actions to Elastic Beanstalk. I'm using this GitHub actions for the deploying to ELB.

My problem is, the deployment is failing as the ELB cannot find the server.js file. I have tried adding server.js file into the deploy.zip file, but then it throws a different error.

I get it, it needs server.js to run, but when I download the build for the same application which is pushed to ELB using Travis CI. It doesn't throw such error and CI/CD is working just fine.

Here is the error logged by ELB (when server.js is not added to deploy.zip):

throw err;
    ^

Error: Cannot find module '/var/app/current/server.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] aws: `node server.js && npm run serve`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] aws script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

> [email protected] aws /var/app/current
> node server.js && npm run serve

I'm also attaching my package.json and main.yml(for CI) files.

package.json:

"name": "climber-mentee-fe",
"version": "1.0.1",
  "scripts": {
    "ng": "ng",
    "start": "node server.js",
    "serve": "ng serve --configuration=dev",
    "start:staging": "gulp set --env=staging && concurrently --kill-others \"node server.js\" \"npm run serve\"",
    "start:prod": "gulp set --env=prod && concurrently --kill-others \"node server.js\" \"npm run serve\"",
    "build": "ng build --configuration=production",
    "test": "ng test",
    "aws": "node server.js && npm run serve",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  ...
  ...
 }

main.yml:

name: My application CI

on:
  push:
    branches:
    - dry-run-actions

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [10.x]

    steps:
    - uses: actions/checkout@v1

    - name: Node ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}

    - name: Installing NPM
      run: npm install

    - name: Building application and copying package.json to dist
      run: npm run build && cp package.json dist/

    - name: Generate deployment package
      run: cd dist && zip -r ../deploy.zip ./*

    - name: Beanstalk Deploy for App
      uses: einaregilsson/beanstalk-deploy@v3
      with:
        aws_access_key: ${{secrets.AWS_ACCESS_KEY}}
        aws_secret_key: ${{secrets.AWS_SECRET_KEY}}
        application_name: my-app
        environment_name: my-app-env
        region: ap-south-1
        version_label: 455
        deployment_package: deploy.zip

Screen of var/app/current enter image description here



Solution 1:[1]

I figured it out finally.

We need to zip the complete root folder excluding the node_modules folder. So, in that case, I won't need any server.js and package.json included inside the dist folder.

Updated yml snippet

- name: Building application
  run: npm run build

- name: Generate deployment package
  run: zip -r deploy.zip * -x ./node_modules

Solution 2:[2]

I solved this problem by adding an .ebextensions directory containing a single file named python.config. The contents of that file are:

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: server:app

This file tells Elastic Beanstalk that the FastAPI application is located in the server.py file and is named app.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Yashwardhan Pauranik
Solution 2 Stephen