1. ホーム
  2. node.js

[解決済み] ExpressJS - Elastic Beanstalk 502 Bad Gateway

2022-02-18 09:03:02

質問

Amazon Elastic Beanstalk 上で Express.js アプリを実行しており、環境は正常に作成されましたが、Amazon が作成した URL を使用して自分の環境にアクセスすると 502 Bad Gateway nginx/1.6.2 というエラーが発生します。StackOverflow の他のリソースを読んだところ、メインファイルの名前を server.js から main.js を設定し port の中に bin/www フォルダーを使用する場合、これは私のアプリの解決策ではないような気がします。私は node server.js というコマンドだと思います。 Elastic Beanstalkを実行しても、うまくいかない(エラーメッセージ)。

node server.js
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: failed to connect to [undefined:27017]

でENV変数を設定しているからです。 .env ファイルでは、サーバーを動かすにはforemanを使うしかないのです。このことから、502エラーはElastic Beanstalkが変数を理解できず、サーバーを失敗させた結果だと考えています。この問題は、私のメインファイルの名前が server.js の中になく bin/www フォルダーに保存されますか?

以下は、私のコードです。 server.js ファイルを作成します。

//Load express
var express = require('express');
var app = express();
var router = express.Router(); // get an instance of the router
var bodyParser = require('body-parser'); // configure app to use bodyParser()
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var aws = require('aws-sdk');

app.use(bodyParser.urlencoded({ extended: true})); // get data from a POST method
app.use(bodyParser.json());
app.use(morgan('dev'));
app.use(cookieParser());


var port = process.env.PORT || 8080; // set the port

var DB_CONFIG = process.env.DB_CONFIGURATION;
var AWS_ACCESS_KEY = process.env.AWS_ACCESS_KEY;
var AWS_SECRET_KEY = process.env.AWS_SECRET_KEY;
var S3_BUCKET = process.env.S3_BUCKET;

var blogDB = require('./config/blogDB.js');
mongoose.connect(blogDB.url);




require('./config/passport.js')(passport);


app.set('view engine', 'ejs'); // set ejs as the view engine

app.use(express.static(__dirname + '/public')); // set the public directory

app.use(session({ secret: 'thisisatest' }));
app.use(passport.initialize());
app.use(passport.session());

app.use(flash());


var routes = require('./app/routes');

app.use(routes); // use routes.js


app.listen(port);
console.log('magic is happening on port' + port);

と私のパッケージファイルです。

{
  "name": "test",
  "main": "server.js",
  "dependencies": {
    "body-parser": "1.6.5",
    "ejs": "^1.0.0",
    "express": "^4.6.1",
    "express-paginate": "0.0.2",
    "mongoose": "~3.6.15",
    "mongoose-paginate": "^3.1.0",
    "serve-favicon": "*",
    "passport" : "~0.1.17",         
    "passport-local" : "~0.1.6",
    "connect-flash" : "~0.1.1",     
    "bcrypt-nodejs" : "latest",
    "morgan": "~1.0.0",
    "cookie-parser": "~1.0.0",
    "method-override": "~1.0.0",
    "express-session": "~1.0.0",
    "aws-sdk": "*" 
  }
}

解決方法は?

今夜、同じ問題が発生しました。ポータルサイトではノードアプリが実行されると主張しているにもかかわらず、ノードアプリが起動されていないことが判明しました。 npm start をデフォルトで使用します。

以下は、それを修正するために行ったことです。

  1. プロジェクトのルートに.ebextensionsというディレクトリを作成します。
  2. .ebextensionsの中にnodecommand.configという名前のファイルを作成します。
  3. nodecommand.configの中に、以下のyamlを追加します。
option_settings:
  - namespace: aws:elasticbeanstalk:container:nodejs
    option_name: NodeCommand
    value: "npm start"

説明書の全文はこちらでご覧いただけます。 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_express.html