AWS上でJavaEE環境を構築しWebアプリを動かしてみた

2019/10/7 全面改訂

=============================================================================
こんにちは。[zd6ir7](https://qiita.com/zd6ir7)です。
[前回の投稿](https://qiita.com/zd6ir7/items/5a7f22ff32dccc0fe3a7)以来、ご無沙汰しています。今回は、AWS上でJavaEE環境を構築し、そこにWebアプリケーションをデプロイして動かしたときのメモを投稿します。
今回動かすアプリケーションは、「[わかりやすいJavaEEウェブシステム入門](http://k-webs.jp/JavaEE/)」の最後に登場する『雑貨屋さん.com』のネットショップのWebアプリケーションです(注1)。

#**1．ソフトウェア構成**#
今回実現させたAWS EC2環境のソフトウェア構成は以下のとおり。

- OS：Linux　カーネルバージョン4.14
- DBMS：Derby (JavaDB) 10.10
- JavaEEコンテナ：glassfish v5.0.1
- Java 1.8.0_222
- アプリケーション：『雑貨屋さん.com』アプリケーション


#**2. 構築・実行手順**#
今回、環境構築、Webアプリケーションを動かした手順は以下のとおり。

###1．AWS Colud9環境を新規構築###
「[初めてのAWS Cloud9導入](https://qiita.com/tu-kun/items/d7b4f1fa19cc93bc5b75)」の記事を参考に、AWSアカウントを作成。マネジメントコンソールのEC2メニューからAmazon LinuxのEC2インスタンスを作成。

###2．Javaのアップデート###
同環境にはJavaが入っているが、「[AWS Cloud9でJava8開発環境を構築](https://qiita.com/tu-kun/items/91efb172f7dd7501602e)」の記事に基づき、Java8にアップデート。

###3．glassfishの導入。###
「[AWS + GlassFish 4.1を構築メモ](https://qiita.com/digdagdag/items/4d26b477bfa3c51771f8)」の記事を参考に、glassfish5.0.1(注2)をインストール。wgetコマンドを打鍵する際、glassfish5.0.1のダウンロード元URLを指定する必要があるが、[glassfishダウンロードサイト](http://download.oracle.com/glassfish)からv5.0.1のURLを特定。glassfishインストールと同時にDerby(JavaDB)もインストールされる。後の手順のため、glassfishは起動したままにしておく。

###4．Derby起動###
今回動かすWebアプリケーションはデータベースとの接続が必要である。のちに接続設定もするため、3．でインストールされたDerbyを起動させる(注3)。

```
sudo bin/asadmin start-database
Starting database in Network Server mode on host 0.0.0.0 and port 1527.
--------- Derby Network Server Information --------
Version: CSS10100/10.10.2.0 - (1582446)  Build: 1582446  DRDA Product Id: CSS10100
(中略)

Starting database in the background.
Log redirected to /opt/glassfish4/glassfish/databases/derby.log.
Command start-database executed successfully.

```


###5．セキュリティグループの設定###
PCからglassfishのコンソール画面並びにアプリケーションにアクセスするため、AWS EC2環境へのセキュリティ設定を追加。具体的には、AWSコンソールのEC2メニューから該当するセキュリティグループを選択し、「インバウンド」タブにてAWS EC2環境へアクセスしたいプロトコル、ポート番号、アクセス元IPアドレスを指定。下の図では、glassfishのデフォルトのポート番号8080とglassfish管理コンソールのポート番号4848、そしてSSHのポート番号22を通す設定にしている。
![security_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186528/653a18cf-7eab-39b7-890f-ace8a9e27975.png)


###6．ホスト名、IPアドレスの入手###
5．に加えて、アクセス先ホスト名またはIPアドレスの情報を入手する必要がある。下の図のとおり、AWSコンソールのEC2メニューで該当する環境を選択するとこれらの情報を参照できる。
![ホスト名とIPアドレス.png](https://qiita-image-store.s3.amazonaws.com/0/186528/39dc24eb-ea49-44ae-ac26-a190356aba83.png)


###7．glassfish起動###
PCのブラウザより、https://<6．で入手したホスト名またはアクセス先IPアドレス>:4848/
にアクセスしてglassfish管理コンソールを起動。3．でhttpsも通す設定もしたため、ブラウザによってはこのサイトを閲覧するかと聞かれる場合もあるが、そのまま閲覧を続ける。下の図のとおり、ユーザ名、パスワードの入力を促されるが、3．で設定したユーザ名、パスワードを入力してログイン。
![glassfishコンソール画面.png](https://qiita-image-store.s3.amazonaws.com/0/186528/4623351c-b84e-2123-c961-efe6ff0ffdef.png)

###8．Derbyとの接続設定###
7.でログインしたglassfish管理コンソール画面からデータソースを設定。具体的には、以下2つの手順を経る。

- 管理コンソール左側「JDBC」メニュー＞「JDBC Connection Pools」から「New」を押して、新たにコネクションプールを作成する。「[わかりやすいJavaEEウェブシステム入門](http://k-webs.jp/JavaEE/)」の情報をもとに設定。ここでは「DerbyPool」という名前で作成。下の図は、このコネクションプールからDerbyデータベースへ疎通したときの状況。
- 同じく「JDBC」メニュー＞「JDBC Resources」から「New」を押して、データソースを作成する。上で作成した「DerbyPool」にJNDI名をつける。同書にならい、JNDI名を「jdbc/mydb」とする。

![DBへの接続.png](https://qiita-image-store.s3.amazonaws.com/0/186528/556b9866-d4cf-c196-e68f-f853ed848e36.png)



###9．Webアプリケーションのデプロイ###
『雑貨屋さん.com』アプリケーションwarファイルをデプロイ用ディレクトリに配置。今回配置にあたり、Tera Termの「SCP」を使ってPCからファイルアップロード。glassfishは起動状態にあるため、配置されるのを契機にglassfishが読み込んでデプロイ処理を実行。以下はデプロイ時のサーバログの抜粋。

```
[2019-10-07T11:38:08.497+0900] [glassfish 5.0] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID             =53 _ThreadName=AutoDeployer] [timeMillis: 1570415888497] [levelValue: 800] [[
  Loading application [zakka-ya-san] at [/zakka-ya-san]]]

[2019-10-07T11:38:08.617+0900] [glassfish 5.0] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=53 _Thre             adName=AutoDeployer] [timeMillis: 1570415888617] [levelValue: 800] [[
  zakka-ya-san was successfully deployed in 9,423 milliseconds.]]

[2019-10-07T11:38:08.619+0900] [glassfish 5.0] [INFO] [NCLS-DEPLOYMENT-02035] [javax.enterprise.system.tools.dep             loyment.autodeploy] [tid: _ThreadID=53 _ThreadName=AutoDeployer] [timeMillis: 1570415888619] [levelValue: 800] [             [
  [AutoDeploy] Successfully autodeployed : /opt/glassfish5/glassfish/domains/domain1/autodeploy/zakka-ya-san.war             .]]

```


###10．Webアプリケーションの実行###
PCのブラウザより、http://<6．で入手したホスト名またはアクセス先IPアドレス>:8080/zakka-ya-san/　にアクセスして『雑貨屋さん.com』アプリケーションを実行。学習用ショッピングサイトが出現(注4)

![アプリケーション起動画面.png](https://qiita-image-store.s3.amazonaws.com/0/186528/78384dc1-f116-2cf2-47dd-c949c9cc1cc9.png)


#**3．おわりに**#
多少苦戦する箇所がありましたが、意外に短期間で構築できました。手軽に環境を作ることができるので本当に便利な時代になったものです。ここまで読んでくださりありがとうございました。


#**脚注**#
(注1)
アプリケーションの詳細は、同書第18章をご参照。正確には最後の演習まで終えた後のものです。
(注2)
glassfish5.0だと、「[AWS + GlassFish 4.1を構築メモ](https://qiita.com/digdagdag/items/4d26b477bfa3c51771f8)」の中で、「asadmin restart-domain」をするのですが、そこでエラーとなってしまいます。詳細は[stackoverflowの記事](https://stackoverflow.com/questions/49984699/glassfish-5-will-not-start-after-enable-secure-admin-command)を参照ください。上位Verであるglassfish5.0.1で問題が解決されているため、ここでは同Verを使用することにしました。
(注3)
Derbyの起動・停止操作に関する詳細は以下URLをご参照。
https://docs.oracle.com/cd/E19159-01/820-3956/genej/index.html
(注4)
もともと学習用アプリケーションであるため、ここでショッピングすることはできません！！