⚙️

EC2で Express と MySQL を使用する方法!

2023/01/11に公開

Express install

初めに

EC2のポート3000番を開けておく必要があります

sudo yum update

まずは、yum を update しておきます

[ec2-user@ip-172-31-82-102 ~]$ sudo yum update
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                     | 3.7 kB  00:00:00     
No packages marked for update

これで OK らしいので、次に進みます

nvm install

nvm を install する。時期によってバージョンが異なるので、「nvm install」と検索し、githubからコマンドを参照することをオススメします。

[ec2-user@ip-172-31-82-102 ~]$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15916  100 15916    0     0   140k      0 --:--:-- --:--:-- --:--:--  141k
=> Downloading nvm as script to '/home/ec2-user/.nvm'

=> Appending nvm source string to /home/ec2-user/.bashrc
=> Appending bash_completion source string to /home/ec2-user/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

インストールが完了したので、有効化しましょう

[ec2-user@ip-172-31-82-102 ~]$ . ~/.nvm/nvm.sh

正しく有効化できたか確認します

[ec2-user@ip-172-31-82-102 ~]$ nvm -v
0.39.2

バージョンが正しく出力され、有効化が確認できました

npm install

npm をインストールしていきます

[ec2-user@ip-172-31-82-102 ~]$ nvm install node
Downloading and installing node v19.3.0...
Downloading https://nodejs.org/dist/v19.3.0/node-v19.3.0-linux-x64.tar.xz...
############################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v19.3.0 (npm v)
Creating default alias: default -> node (-> v19.3.0)

インストール成功したので、バージョンを確認してみます

[ec2-user@ip-172-31-82-102 ~]$ node -v
node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)

なぜかエラーがでました。調べてみると、どうやら node v19.3.0 がまだ対応していないような記事を発見したので、バージョンを変更します。
まずは現在のバージョンを削除しましょう。

[ec2-user@ip-172-31-82-102 ~]$ rm -rf $NVM_DIR

たった一行ですみます。上記を実行したら、バージョンを指定してインストールしていきます。
v18 でもエラーが確認されたので、今回は、v17 を選択していきます。

[ec2-user@ip-172-31-82-102 ~]$ nvm install 17
Downloading and installing node v17.9.1...
Downloading https://nodejs.org/dist/v17.9.1/node-v17.9.1-linux-x64.tar.xz...
############################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v17.9.1 (npm v8.11.0)
Creating default alias: default -> 17 (-> v17.9.1)

今度こそ、バージョンが正しく出力されるか確認しましょう

[ec2-user@ip-172-31-82-102 ~]$ node -v
v17.9.1

出力されました。
npm の方も合わせて確認しましょう

[ec2-user@ip-172-31-82-102 ~]$ npm -v
8.11.0

うまくインストールできていますね

Express install

いよいよ最後は、express をインストールしていきます

[ec2-user@ip-172-31-82-102 ~]$ npm install -g express-generator

インストールが完了したので、プロジェクトを作成しましょう

[ec2-user@ip-172-31-82-102 ~]$ express --view=ejs ex_project

ex_project はプロジェクト名になるので、好きな名前に変更して実行してください
実行が終了したら、ディレクトリを見てみましょう

[ec2-user@ip-172-31-16-253 ~]$ ls -l
drwxr-xr-x 6 ec2-user ec2-user 92 12月 22 11:50 ex_project

プロジェクト名で指定したディレクトリが新たに作成されていることがわかります。
最後に、新たに作成されたディレクトリに移動し、必要なライブラリのインストールを行います

[ec2-user@ip-172-31-16-253 ex_project]$ npm install

ここまでで、環境が整ったので、実行してみましょう

[ec2-user@ip-172-31-16-253 ex_project]$ npm start

実際に、EC2のIPアドレス:3000にアクセスしてみます

Welcome to Express と表示されたため、設定は全てうまくいきました。
あとは、好きなように変更していきましょう!

MySQL install

初めに

まず、作業を行う前に root ユーザになっておきます

[ec2-user@ip-172-31-16-253 ~]$ sudo su -
[root@ip-172-31-16-253 ~]#

ec2-user から root になっていれば、切り替えに成功しています

remove mariadb

EC2にはあらかじめ mariadb がインストールされているので、関連するファイルを削除します

[root@ip-172-31-16-253 ~]# yum remove mariadb-*

Complete! と出力されれば成功です

MySQL install

ここから MySQL のインストールを開始していきます

[root@ip-172-31-16-253 ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm

まずは、MySQL の RPM パッケージを取得します

[root@ip-172-31-16-253 ~]# ls -l
-rw-r--r-- 1 root root 11196 Aug 26 18:56 mysql80-community-release-el7-7.noarch.rpm

うまく取得できていることが確認できます
次に、localinstall を実行していきます

[root@ip-172-31-94-76 ~]# yum localinstall -y mysql80-community-release-el7-7.noarch.rpm

Complete! と出力されれば、こちらも完了です
次は、mysql-server をインストールします

[root@ip-172-31-16-253 ~]# yum install --enablerepo=mysql80-community mysql-community-server

途中で何度か質問されますが、全て「y」で大丈夫です
これで、インストール作業は終了です

[root@ip-172-31-94-76 ~]# mysql --version
mysql  Ver 8.0.31 for Linux on x86_64 (MySQL Community Server - GPL)

バージョンを確認しても、うまくインストールできていることがわかります

MySQL 起動

インストールが完了したので、実際に起動してみましょう

[root@ip-172-31-16-253 ~]# sudo systemctl enable --now mysqld

何も出力されません
実行が終了したら、状態を確認します

[root@ip-172-31-16-253 ~]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2023-01-15 09:20:35 UTC; 7s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 32107 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 32180 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─32180 /usr/sbin/mysqld

Jan 15 09:20:28 ip-172-31-94-76.ec2.internal systemd[1]: Starting MySQL Server...
Jan 15 09:20:35 ip-172-31-94-76.ec2.internal systemd[1]: Started MySQL Server.

active となっているため、MySQL がうまく起動できていることがわかります
しかし、このままでは MySQL に接続することが出来ません
接続するためには、root の一時パスワードを変更しなければいけません

[root@ip-172-31-16-253 ~]# sudo grep 'temporary password' /var/log/mysqld.log
2023-01-15T09:20:30.950479Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [password]

まずは、mysqld.log の中から一時パスワードを見つけ出します
その後、mysql_secure_installation を実行し、パスワードを設定します

[root@ip-172-31-94-76 ~]# mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password: 
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : no

 ... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 

途中の回答は、状況に応じて変化させてください
設定も全て終了したので、MySQL に接続してみましょう!

[root@ip-172-31-94-76 ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.31 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

接続できました!
EC2での開発、楽しんでください!

Discussion