前回まででエクリプスで作成したプロジェクトをGCEにアップすることが出来るようになった。今回はそれにMySQLを連携させていく。

Todoアプリの作成(ローカル)

DBを絡めたお題として、まずは定番のTodoアプリを作成しよう。作成記事がこちらにあるのでまずはそこを見ながらローカル環境にTodoアプリを作成する。

ローカルで実行確認

作成が終わったら、Readを右クリックしてサーバーで実行。新規登録から3件ほど適当にTodoを登録しておこう。

GCPでデータベースを使えるようにする

GCPでデータベースを使うにはGoogle Cloud SQLというサービスを利用する。

インスタンス作成

GCP左側メニューからSQLを選択

インスタンス作成を押す

MySQLを選択

設定画面では以下のように設定する。rootパスワードは忘れると大変なのでメモ帳などに貼り付けておこう。
インスタンスID:任意
rootパスワード:任意
リージョン、ゾーン:VMインスタンスに合わせる
バージョン:5.7

IPアドレスをコピーしてメモ帳に貼ったら、インスタンス名をクリックする。

接続設定
接続からネットワークを設定を押す

初日に作成したGCEからこのデータベースに接続できるようにする。
GCEのインスタンス名とIPアドレスを入力して完了を押す。

保存を押す

GCEにMySQLをインストール

GCEでmysqlコマンドを使えるようにするため、インストールする必要がある。
まずはGCEにログインし、rootユーザーになる。コマンドは以下

$ ssh mjpurin@00.000.00.00
Last login: Fri Nov 29 12:40:15 2019 from 103.5.140.187
[mjpurin@instance-1 ~]$ su
Password: //パスワード入力
[root@instance-1 mjpurin]# 

1.CentOS7にプリインストールされているmariaDBの削除

はじめにCentOS7にプリインストールしてあるmariaDBを削除しておこう。

# yum -y remove mariadb-libs
Complete!がでればOK

MySQL Yum リポジトリをシステムのリポジトリリストに追加

# yum  -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

インストール

yum -y install mysql-community-server

確認

# mysqld --version

自動起動設定

# systemctl enable mysqld.service

起動

# systemctl start mysqld.service

確認

# systemctl status mysqld.service
OK!!

接続

これで準備はすべて整った、GCPに作ったmysqlインスタンスに接続してみよう。
先程メモ帳に貼り付けたSQLのIPアドレスとパスワード入力する。

# mysql -h 00.00.00.00 -u root -p
Enter password: //sqlのパスワードを入力

GCP上のSQLインスタンスに接続することができた!!

DBの作成

クラウド上のSQLにもデータベースを作成しよう。mysql>のプロンプトの後ろに以下を入力する。

CREATE DATABASE todoapp
DEFAULT CHARACTER SET utf8;
OK!!

DBのエクスポート,インポート

ローカルで作ったDBの情報をこちらにまるっと持ってこよう。まずはexitを連打してGCEへの接続を切る。

バックアップファイルを作成する。コマンドは以下。
パスワードを聞かれたら入力する。(以下の例の場合、rootユーザーのパスワード)

$ mysqldump -u root -p todoapp > ~/desktop/backup.sql

確認

以下のようにバックアップファイル(dumpファイル)を確認する。

$ less ~/desktop/backup.sql

以下は抜粋だが、テーブルを作ってデータを挿入しているsqlが確認できる。

バックアップファイルを確認したので今度はこのファイルの情報を元にしてGCP上のSQLインスタンスに復元しよう。まずはscpでGCE上にコピーする。

$ scp ~/desktop/backup.sql mjpurin@00.00.00.00:/home/mjpurin

確認

接続して確認する。

$ ssh mjpurin@00.00.00.00
$ ls -la
転送されている。

このファイルをもとにDBを復元する。この際IPアドレスとパスワードは先程メモ帳にメモしたDBのIPアドレスなので間違えないように。

$ mysql -h 00.00.00.00 -u root -p todoapp < backup.sql
Enter password: 

確認

$ mysql -h 00.00.00.00 -u root -p todoapp
Enter password: 

todoappデータベースに接続された。確認してみよう。mysql>プロンプトの後ろに以下を入力

show tables;
todosテーブルがあるぞ!

SELECTもしてみよう。

select * from todos;

OK!!!!
これでローカル環境に構築したDBをクラウド上(GCP)に持ってくることができた!

エクリプスでwarファイルの作成

いよいよラストスパートだ。エクリプスに行ってtodoappのwarファイルを作成する。この際、2つ変更しなければならないファイルがあるので注意だ。

1.context.xml
現在context.xmlの設定になっているのでgcp用を追記してあげよう。以下が変更点だ。

name=”jdbc/gcp”
url=”jdbc:mysql://00.000.00.00/todoapp” //00.000のところにはDBのIPアドレス
password=”sqlインスタンスのパスワード”

<?xml version="1.0" encoding="UTF-8" ?>
<Context>
  <Resource
      name="jdbc/jsp"
      auth="Container"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/todoapp"
      connectionProperties="autoReconnect=true;verifyServerCertificate=false;useSSL=false;requireSSL=false;useUnicode=true;characterEncoding=UTF-8;"
      username="root"
      password="root"
      validationQuery="select 1"/>
  <Resource
      name="jdbc/gcp"
      auth="Container"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://00.000.00.00/todoapp"
      connectionProperties="autoReconnect=true;verifyServerCertificate=false;useSSL=false;requireSSL=false;useUnicode=true;characterEncoding=UTF-8;"
      username="root"
      password="sqlインスタンスのパスワード"
      validationQuery="select 1"/>
 </Context>

2.TodoDAO.java
今追記したresourceを読み込むように変更する。context.lookupしている部分の最後をgcpに変更する。

//接続処理
	private void connect() throws NamingException, SQLException {
		Context context = new InitialContext();
		DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/gcp");
		db = ds.getConnection();
	}

warファイル作成

ここまでくれば後は前回と同じだ。アプリ名を右クリックしてExportからwarファイルを作成

いつものようにデスクトップにtodoappフォルダを作ってそこに保存しよう。

scpでGCEにコピー

作成したwarファイルgceにコピーする。

$ scp ~/desktop/todoapp/todoapp.war mjpurin@00.000.00.00:/home/mjpurin

ログインしてルートになってwebappsに配置

$ ssh mjpurin@00.000.00.00
$ su
Password: 
# mv todoapp.war /opt/apache-tomcat-9.0.29/webapps

proxy-ajp.confの変更

# vi /etc/httpd/conf.d/proxy-ajp.conf

追記部分は以下

<Location /docs/> 
    ProxyPass ajp://127.0.0.1:8009/docs/
</Location>
<Location /NowTime/>
    ProxyPass ajp://127.0.0.1:8009/NowTime/
</Location>
<Location /bmi-app/>
    ProxyPass ajp://127.0.0.1:8009/bmi-app/
</Location>
<Location /todoapp/>
    ProxyPass ajp://127.0.0.1:8009/todoapp/
</Location>

apache再起動

# service httpd restart

完成!!!

以上で完成だ。Webブラウザから
http://00.000.00.00/todoapp/Read
にアクセスしてみよう。

ローカルにて開発したDBを絡めたアプリをGCP上に再現することができた。

最後に

全5回にわけてエクリプスで開発したWebプロジェクトをGCPにもってくる方法を解説した。潤沢にある無料期間を利用して十分に練習していただきたい。

その後の方針としては、そのまま課金して使う。速度などを犠牲にして無料枠で使い続ける。ここで得た知識をもとにVPSで環境を構築するなどが考えられる。

無料枠で使い続ける方法や、VPSでの環境構築などはまた機会を改めて解説する予定だ。