Node.js+Express+MySQL+AWS Elastic Beanstalkでhello world

アプリについて

MySQLからデータをとってきて画面に表示するだけのアプリです。
ORMにSequelizeを使用します。
(MikeはMySQLのUsersテーブルから取得してきた情報です。)

f:id:noifuji:20210402160423p:plain

ローカルでのアプリ作成

プロジェクト作成

npm init -y

package.jsonのscriptsの中に下記の行を追加してください。

"start": "node index.js",

必要なライブラリをインストール

npm i express mysql2 dotenv sequelize --save
npm i sequelize-cli -D

.

MySQLの設定

mysqlにログインし、データベースを作成しましょう。

mysql -u root -p
create database dev;

ここでユーザー名、パスワード、デーベース名を控えておきましょう。



sequelizeの設定

プロジェクトルートに「.sequelizerc」ファイルを作成し、
下記のように記述してください

// .sequelizerc

const path = require('path');

module.exports = {
  'config': path.resolve('db/config', 'config.js'),
  'models-path': path.resolve('db', 'models'),
  'seeders-path': path.resolve('db', 'seeders'),
  'migrations-path': path.resolve('db', 'migrations')
};
npx sequelize-cli init

生成されたフォルダを確認しましょう。
f:id:noifuji:20210402151010p:plain

さらに、「db/config/config.json」を削除し、「db/config/config.js」を作成してください。

require('dotenv').config();

module.exports = {
    "development": {
        "username": process.env.RDS_USERNAME,
        "password": process.env.RDS_PASSWORD,
        "database": process.env.RDS_DB_NAME,
        "host": process.env.RDS_HOSTNAME,
        "dialect": "mysql"
    },
    "test": {
        "username": "root",
        "password": null,
        "database": "database_test",
        "host": "127.0.0.1",
        "dialect": "mysql"
    },
    "production": {
        "username": "root",
        "password": null,
        "database": "database_production",
        "host": "127.0.0.1",
        "dialect": "mysql"
    }
};

.


環境変数の設定

プロジェクトルートに「.env」を作成しましょう。

RDS_HOSTNAME=<ここにデータベースのホスト名(ローカルならlocalhost)>
RDS_USERNAME=<ここにデータベースのユーザー名>
RDS_PASSWORD=<ここにデータベースのパスワード>
RDS_DB_NAME=<ここにデータベース名>

.


テーブルの構築

sequelizeでユーザー情報を格納するモデルを作成します。

npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string

マイグレーションを行います。

npx sequelize-cli db:migrate

次に初期データの投入を行うため、seedを作成します。

npx sequelize-cli seed:generate --name demo-user

「db/seeders」フォルダに新たにファイルが生成されるので、次のように修正してください。

'use strict';

module.exports = {
  up: async(queryInterface, Sequelize) => {
    /**
     * Add seed commands here.
     *
     * Example:
     * await queryInterface.bulkInsert('People', [{
     *   name: 'John Doe',
     *   isBetaMember: false
     * }], {});
     */
    return queryInterface.bulkInsert('Users', [{
      firstName: 'Mike',
      lastName: 'Doe',
      email: 'example@example.com',
      createdAt: new Date(),
      updatedAt: new Date()
    }]);
  },

  down: async(queryInterface, Sequelize) => {
    /**
     * Add commands to revert seed here.
     *
     * Example:
     * await queryInterface.bulkDelete('People', null, {});
     */
  }
};

次に、実際にテーブルへデータ投入します。

npx sequelize-cli db:seed:all

.


index.jsの作成

プロジェクトルートにindex.jsを作成しましょう。

const express = require('express');
const mysql = require('mysql2');
require('dotenv').config();
const app = express();
const port = process.env.PORT;

const db_setting = {
    host: process.env.RDS_HOSTNAME,
    user: process.env.RDS_USERNAME,
    password: process.env.RDS_PASSWORD,
    database: process.env.RDS_DB_NAME,
};


app.get('/', (req, res) => {
    const connection = mysql.createConnection(db_setting);
    connection.query(
        'SELECT * FROM Users;',
        function(err, results, fields) {
            if (!!err) {
                console.log(err);
                res.send('Database Error.');
                return;
            }
            res.send('Hello World!' + ' I am ' + results[0].firstName + '.');
        }
    );

});

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`);
});

ここまで作成できたら、下記のコマンドでアプリを実行してください。
多分、正常に動作すると思います。
ここまでできたら、Beanstalkへのデプロイをおこなっていきます。





Beanstalkへのデプロイ

Beanstalk環境構築

AWSのbeanstalkを開き、Create Applicationをクリックします。
https://ap-northeast-1.console.aws.amazon.com/elasticbeanstalk/home?region=ap-northeast-1#/welcome
順に設定を指定していきます。
f:id:noifuji:20210402152944p:plain
f:id:noifuji:20210402153021p:plain
f:id:noifuji:20210402153141p:plain

環境構築が完了したら、作成された環境を開きましょう。
こちらのような画面が表示されていればokです。
f:id:noifuji:20210402153857p:plain
.


RDSの設定

画面左側のメニューから設定->データベース->編集を選択します。
f:id:noifuji:20210402154028p:plain

データベースの情報を入力する画面が表示されるので、
ユーザー名とパスワードを入力しましょう。(新規に作成するデータベースなので、任意のものでokです。)
入力できたら「適用」をクリックします。
f:id:noifuji:20210402154153p:plain
.


Nodejsアプリをzip化してアップロード

プロジェクトルートに「.ebextensions」フォルダを作成し、
「migration.config」ファイルを作成する。

container_commands:
  01_migrate:
    command: "npx sequelize-cli db:migrate"
  01_seed:
    command: "npx sequelize-cli db:seed:all"

プロジェクトフォルダの「.env」ファイル以外をすべて選択し、zip化してください。

Beanstalkの画面から作成したzipをアップロードします。
f:id:noifuji:20210402155532p:plain