この記事では、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を作成し直しましたか?
確認してみてください。