AWS_WEB3層環境構築③


前回の記事
https://qiita.com/shinichi_yoshioka/items/e358f57a3ecb7735c091
前々回(初回)の記事
https://qiita.com/shinichi_yoshioka/items/7226b9ebaad06c569c80
構成図
![構成図_v4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/04b0c8ca-0c93-c0f9-2ae6-be4595574f25.png)

前回の続きをやっていく。
VSCodeすら使ったことなかったが、VSCodeの拡張機能にdrawioというものがあって、
カッコ良いアイコンなどが使えるのを教えてもらった。
さっそく使ってみたが、色のセンスはお察しだ。

初回記事ではDBの切り替えをしたいと書いたが、まずは正常な状態を作りたい。
WEBサーバにはリバースプロキシの設定（To:APサーバ)をし、APサーバでJSPを使って、
DBを参照できることを正常な状態とすることにした。

◆リバースプロキシの設定
対象：WEBサーバ
/etc/nginx/conf.d　配下にserver.confというファイルを作る。

```
cd /etc/nginx/conf.d
vi server.conf
```
server.confの中身は、APサーバのプライベートアドレス:ポート番号(8080)を指定した。

```
#server.conf
server{
   location / {
        proxy_pass    http://172.16.3.246:8080/;
    }
}
```
nginxのサービスを再起動(systemctl restart nginx)して、ブラウザにWEBサーバのパブリックアドレスを入力し、
APサーバのtomcatのページが表示されることを確認した。
[自宅PC]-[Internet]-[WEBサーバ]-[APサーバ] ←ここまでのイメージ
![tomcat5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/a901350f-ef45-caa5-b203-f1cb1b1b7902.png)

◆JDBC for MySQLのインストール
対象：APサーバ
APサーバにJDBCドライバーをインストールしようと思ったのだが、AmazonLinux用がなかった＾＾；；；
ということで、前回作ったAPサーバはぶっ壊して、再度RedHatで作りなおして、Tomcatのインストールまでは済んだとこ。
これがクラウドの良いところである。（オンプレでOS選定ミスってたら、首飛んでた)
EIPを使っていたので、記事の不整合もない！
OSやJavaのバージョン、Tomcatの状態はこんな感じ。
![tomcat3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/07fc6144-1eaf-4b06-35ef-a92c70252e39.png)
MySQLコミュニティサーバからJDBCドライバーのRPM(RHEL用)をダウンロードしインストールしようとしたが、
依存関係でopenjdk-headlessが必要と言われた。
yumでopenjdk-headlessをインストール後に、mysql-connector-javaをRPMコマンドでインストールした。

```
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.23-1.el8.noarch.rpm
yum install java-1.8.0-openjdk-headless -y
rpm -ivh mysql-connector-java-8.0.23-1.el8.noarch.rpm
rpm -qa | grep mysql
```
![tomcat4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/cb18493b-1e83-6d19-b93c-aaacf485f40f.png)

◆サンプルデータベースの用意
対象：DBサーバ
参照するためのDBを用意するため、以下からworld databaseをインポートすることにした。
https://dev.mysql.com/doc/index-other.html
まずはDBサーバにssh接続し、wgetコマンドにてダウンロードした。
gz形式だったため、gunzipコマンドにて解凍した。

```
wget https://downloads.mysql.com/docs/world.sql.gz
gunzip world.sql.gz
```
次にMySQLにログインし、SOURCEコマンドにて、world.sqlをインポートした。

```
mysql> SOURCE /root/world.sql
```
データベースに"world"がインポートされた。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TEST               |
| auth               |
| mysql              |
| performance_schema |
| sys                |
| world              |
+--------------------+
```
データベースをworldに切り替え、テーブルが存在することを確認した。

```
mysql> use world;

mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.00 sec)
```

MySQLはデフォルトで、外部からのアクセスを許可されていないため、
以下の権限追加をした。
権限追加後は、FLUSHにて権限を再読み込みした。
※\*(すべてのデータベース).*(すべてのテーブル)を認識できるようにユーザ名@接続元IPアドレス(APサーバ)へ権限を与える

```
mysql> GRANT all ON *.* TO root@'172.16.3.246' IDENTIFIED BY 'MySQLのパスワード';     
mysql> FLUSH PRIVILEGES;    ←権限関係の再読み込み
```




◆JDBCドライバの配置とサンプルJSPの作成
対象：APサーバ
JDBCドライバーは/lib配下に配置しないとダメらしく、初期配置から移動させた。

```
mv /usr/share/java/mysql-connector-java.jar /opt/tomcat/lib/
```
![tomcat5.5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/2e61655b-6102-4576-07e8-0a3c9db1c8ee.png)
JSPについては初心者でggりまくった結果、JSPも配置が重要らしく、
/opt/tomcat/webapps配下にjspディレクトリを作成し、パーミッションを750にし、所有者はtomcatに変更した。

```
cd /opt/tomcat/webapps
mkdir jsp
chown tomcat:tomcat jsp
chmod 750 jsp
```
![tomcat6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/dedea2a5-863a-7216-46c7-06c2e4ca4aeb.png)


/opt/tomcat/webapps/jsp配下には、test.jspを作成したが、
JSPの知識がなさすぎて、以下URLを参考にさせていただいた。
https://michael-e29.hatenadiary.org/entry/20111107/1320630444

jdbc:mysql://172.16.3.6:3306/world
↑DBサーバのアドレス：ポート番号/データベース名
※worldはデータベース名。
※ID,Name,CountryCode,District,Populationはデータベースのカラム名

```
###test.jspの中身###
<%@ page contentType="text/html; charset=utf-8" import="java.sql.*" %>

<html>
<head>
<title>DB参照テスト</title>
</head>

<body>
<h1>DB参照テスト</h1>

<tr>
<td>ID</td> <td>Name</td>　<td>CountryCode</td>　<td>District</td>　<td>Population</td>
</tr>

<%
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn=DriverManager.getConnection("jdbc:mysql://172.16.3.6:3306/world?" +
        "user=root&password=MySQL@001&useUnicode=true&characterEncoding=utf-8");
    Statement st=conn.createStatement();
    ResultSet res = st.executeQuery("select * from city;");

    while(res.next()){
        out.println("<tr>");
        out.println("<td>" + res.getString("ID") + "</td>");
        out.println("<td>" + res.getString("Name") + "</td>");
        out.println("<td>" + res.getString("CountryCode") + "</td>");
        out.println("<td>" + res.getString("District") + "</td>");
        out.println("<td>" + res.getString("Population") + "</td>");
        out.println("</tr>");
    }
    st.close();
    conn.close();

%>
</table>
</body>
</html>
```

APサーバとDBサーバの連携の準備ができたので、APサーバのTomcatサービスを再起動。
あとDBサーバのmysqldサービスを再起動し、ブラウザにJSPのパスを入力する。
ちなみにJSPファイルを置いたパスは　/opt/tomcat/webapps/jsp/test.jsp だが、
ブラウザでは/webapps/配下を入力する。
`http://WEBサーバのパブリックアドレス/jsp/test.jsp`
![DB参照.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/7dcc4584-d3dc-2f3d-e5e3-3f19c07d77b6.png)

ぐちゃぐちゃだけど、一応DB参照できたので
一応WEB3層構成はできた・・・。
めちゃ時間かかったけど、つまづきながらハマりながら色々覚えれたので良かったです。
次回はNATゲートウェイの作成と、AnsibleでJSP内の文字列を置換することで
参照するDBを切り替えようと思います。

つづく