スポンサーリンク

Amazon EC2 デプロイ(CD/CI)

EC2でnginx-SpringBoot-RDSのMySQL

投稿日:2022年2月26日 更新日:

この記事では、EC2-RDSの2層構造でWebアプリケーションを構築します。
と言っても、1層の「EC2-1インスタンスでnginx-SpringBoot-MySQL-redisを構築」のMySQLをRDS化するだけです。

なぜ、2層で作成するのか?

1層、つまり1台のEC2に全てのミドルウェアを載せていただときと比べて、どんなメリットがあるのでしょうか?

RDSインスタンスを作成

RDSのコンソール画面からMySQLを作成します。

ここでは、下記以外は特に気にする必要ありません。

テンプレート無料利用枠
設定>DB インスタンス識別子任意
設定>マスターユーザー名任意
設定>マスターパスワード設定しておくと楽
(自動生成で後でマネコンから取得でもOK)
接続>パブリックアクセスあり
(ローカルから接続するために必要)
接続>VPC セキュリティグループdb-for-admin-sgを追加(下記)

セキュリティーグループは次のものを追加します。

タイプ...MySQL/Auroraを選択。
ソース...ここでは「Anywhere-IPv4」とします。セキュリティを考慮したい人は、マイIPにしておいてください。

最後に、データベースの作成ボタンを押して、データベースを作成します。

RDSインスタンスにデータベース・ユーザーを作成

RDSインスタンスのステータスが「利用可能」になったら、
・アプリ用データベース
・アプリ用データベースへの接続ユーザー
を作成します。

ローカルから接続するときに、エンドポイントが必要なのでメモしておきましょう。

データベース・ユーザー作成

ローカルから接続し、RDSインスタンスにadminで接続し、アプリ用データベースとアプリ用データベースへの接続ユーザーを作成します。

// adminでRDS-MySQLに接続
noricgeographic@MacBook-Air ~ % mysql -uadmin -p -h okozukai-db.cgzqjfdvnh64.ap-northeast-1.rds.amazonaws.com
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.27 Source distribution

Copyright (c) 2000, 2021, 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> CREATE DATABASE okozukai CHARACTER SET =utf8mb4;
Query OK, 1 row affected (0.03 sec)

// アプリ用データベースへの接続ユーザーを作成
mysql> CREATE USER 'okozukaiadmin'@'%' IDENTIFIED BY 'lknuve7gAre%';
Query OK, 0 rows affected (0.04 sec)

// 接続ユーザーにアプリ用データベースへの権限付与
mysql> GRANT ALL PRIVILEGES ON okozukai.* TO 'okozukaiadmin'@'%';
Query OK, 0 rows affected (0.03 sec)

作成した接続ユーザーでローカルから接続できることを確認しておきます。
上記のCREATE~GRANT文で作成した接続ユーザーはアプリ用データベースにのみ権限付与したので、接続時に-Dオプションで接続先データベースを指定する必要があります。

noricgeographic@MacBook-Air ~ % mysql -uokozukaiadmin -p -h okozukai-db.cgzqjfdvnh64.ap-northeast-1.rds.amazonaws.com -D okozukai
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 8.0.27 Source distribution

Copyright (c) 2000, 2021, 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> 

ERROR 2005 (HY000): Unknown MySQL server host 'エンドポイント名' (n)

指定されたエンドポイントが正しくなくMySQLに接続できない。
コンソールでエンドポイント名を確認すること。

ERROR 2003 (HY000): Can't connect to MySQL server on 'エンドポイント名' (n) 

エンドポイントにMySQLは存在するが、何らかの理由で接続できない。
多くの場合は、セキュリティグループが設定されていない。
セキュリティーグループを設定してください。

ERROR 1045 (28000): Access denied for user 'ユーザー名'@'xxx.yyy..jp' (using password: YES)

パスワードが間違っている。
または、ユーザーが権限のないデータベースに接続しようとしている。
-Dで権限のあるデータベースを指定しよう。

DDL実行

DDLの実行は、作成した接続ユーザーでmysqlコマンドで接続して、CREATE文を実行することで可能です。

ここでは、ローカルのintelliJからgradle flywayMigrateを実行しました。

build.gradleのflyway設定箇所をRDSに変更するだけです。
あとはローカルのMySQLにflywayMigrateするときと同様です。

これでDDLを流し込むことができました。
あとはアプリのデプロイです。

EC2からRDSに接続できるか確認

念の為、SpringBootをデプロイするEC2からRDSインスタンスに接続できることを確認しておきます。

// EC2にログイン
noricgeographic@MacBook-Air ~ % ssh -i ~/.ssh/ec2-keypair.pem ec2-user@54.238.134.155                                                              
Last login: Sat Feb 26 09:50:31 2022 from fp74524205.tkyc513.ap.nuro.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

// EC2からRDSに接続できるか確認
[ec2-user@ip-172-31-3-48 ~]$ mysql --version
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

[ec2-user@ip-172-31-3-48 ~]$ mysql -uokozukaiadmin -p -h okozukai-db.cgzqjfdvnh64.ap-northeast-1.rds.amazonaws.com
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 8.0.27 Source distribution

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-1インスタンスでnginx-SpringBoot-MySQL-redisを構築」で作成したEC2インスタンスを起動してから進めてください。

ローカルでファットjarを作成し、EC2にアップロードし、EC2でファットjarを実行します。

まずはapplication.ymlの接続先を変更します。

spring:
    ## DB接続情報
    dataSource:
        url: jdbc:mysql://okozukai-db.cgzqjfdvnh64.ap-northeast-1.rds.amazonaws.com:3306/okozukai
        username: okozukaiadmin
        password: lknuve7gAre%
        driver-class-name: com.mysql.cj.jdbc.Driver

gradle bootJar や gradle build でファットjarを作成します。

scpコマンドでEC2に送信します。

% scp -i ~/.ssh/ec2-keypair.pem ./build/libs/okozukai-system-0.0.1-SNAPSHOT.jar ec2-user@54.238.134.155:~/
okozukai-system-0.0.1-SNAPSHOT.jar

あとはEC2でファットjarを実行しましょう。

// EC2に接続
noricgeographic@MacBook-Air ~ % ssh -i ~/.ssh/ec2-keypair.pem ec2-user@54.238.134.155                                                              
Last login: Sat Feb 26 09:50:31 2022 from fp74524205.tkyc513.ap.nuro.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

// ファットjarを起動
[ec2-user@ip-172-31-3-48 ~]$ java -jar okozukai-system-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.3)

2022-02-28 02:24:59.994  INFO 4345 --- [           main] c.s.o.OkozukaiSystemApplication          : Starting OkozukaiSystemApplication using Java 11.0.13 on ip-172-31-3-48.ap-northeast-1.compute.internal with PID 4345 (/home/ec2-user/okozukai-system-0.0.1-SNAPSHOT.jar started by ec2-user in /home/ec2-user)
2022-02-28 02:25:00.025  INFO 4345 --- [           main] c.s.o.OkozukaiSystemApplication          : No active profile set, falling back to default profiles: default
2022-02-28 02:25:03.381  INFO 4345 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-02-28 02:25:03.412  INFO 4345 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-02-28 02:25:03.413  INFO 4345 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-02-28 02:25:03.570  INFO 4345 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-02-28 02:25:03.570  INFO 4345 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3360 ms
2022-02-28 02:25:05.981  INFO 4345 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page template: index
2022-02-28 02:25:06.422  INFO 4345 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-02-28 02:25:06.450  INFO 4345 --- [           main] c.s.o.OkozukaiSystemApplication          : Started OkozukaiSystemApplication in 8.35 seconds (JVM running for 9.77)

ブラウザからアクセスして、動作確認を行います。

DB使用箇所が期待通り動いていれば、EC2のSpringBootからRDSに接続できています。

お疲れ様でした!

java.net.UnknownHostException: okozukai1.cgzqjfdvnh64.ap-northeast-1.rds.amazonaws.com: Name or service not known

そのような接続先は存在しませんと怒られています。
application.yml(or .properties)のRDSのエンドポイントが間違ってませんか?
エンドポイント変更したあと、jarを作成し直しましたか?
確認してみてください。

Udemyのハンズオン動画講座でSpringBootのスキルを磨く!

スポンサーリンク

-Amazon EC2, デプロイ(CD/CI)

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.