【CodePipeline×ElasticBeanstalk】JavaアプリケーションをCodePipelineでElasticBeanstalkにCI/CDする その2

Javaアプリケーション（データベースから値を取得し、JSON形式で結果を返す）をCodePipelineでElasticBeanstalkにCI/CDするハンズオンです。
[【CodePipeline×ElasticBeanstalk】JavaアプリケーションをCodePipelineでElasticBeanstalkにCI/CDする その1](https://qiita.com/C_HERO/items/387bb394f5862421513a)
の続きです。

## 環境
- OS：Windows10
- IDE：Eclipse 2020-03
- JDK：Amazon Correto 8
- フレームワーク：Spring Boot
- AWS
    - CodePipeline
        - CodeCommit
        - CodeBuild
        - CodeDeploy
    - Elastic Beantalk
        - Java SE（Java 8 バージョン 2.10.8）
        <br>→ 異なるプラットフォームブランチ（Corretto 11など）でも同手順でできます。
        - RDS：MySQL Community Edition（バージョン8.0.17）

## 手順
### 3. Elastic Beanstalk環境の作成
続いて、Elastic Beanstalk環境を作成します。
環境作成 → EC2起動してしまうと、課金の対象になってしまうので、できれば手順5のパイプラインの作成まで一気に駆け抜けるのがベスト！
手順1 ,2でちょっと疲れたな―って方は一度お休みして、気力が回復してから臨んでください。

では、いってみましょー！

#### [1] 環境、アプリケーションの新規作成
(1) AWSマネジメントコンソールにログインし、「サービス」（①） > 「Elastic Beanstalk」を探してクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/028eba2e-541c-e889-af0a-fe1833e089b2.png)

(2) ナビゲーションペインにて、「環境」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/a100e4fa-146d-6dca-7b08-54ed6c591c81.png)

(3) 「新しい環境の作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f72b220f-b6df-2fa9-370d-1dee04450c1d.png)

(4) 「ウェブサーバー環境」を選択し（①）、「選択」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/d41c1733-6016-be13-862c-4801b44d7988.png)

(5)「ウェブサーバー環境の作成」ページに遷移するので、以下の通り入力・設定し、「より多くのオプションの設定」をクリック（⑨）。

|No|名称|設定内容|
|---|---|---|
|①|アプリケーション名|sample-eb-java|
|②|環境名|アプリケーション名を入力すると自動で入力される（※1）|
|③|プラットフォーム|Java|
|④|プラットフォームのブランチ|Java 8 running on 64bit Amazon Linux|
|⑤|プラットフォームのバージョン|2.10.9：Recommendedとなっているもの|
|⑥|アプリケーションコード|「コードのアップロード」を選択|
|⑦|ソースコード元|「ローカルファイル」を選択|
|⑧|ファイルを選択|「1-[4]jarファイルの作成」で作成したjarファイルをアップロード（※2）|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/2acccb1e-e31d-9155-29d5-ca804ebef033.png)

※1：すでに同名の環境が存在する場合は、環境名の後ろに「-n」（nは数字）が入る。
※2：プラットフォームブランチにJava 8を選択した場合は、代わりに
[Elastic Beanstalk での Java の開始方法 | aws](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/java-getstarted.html)より、
「java-se-jetty-gradle-v3.zip」を取得し、使用してもOK。

(6) オプションの設定画面に遷移します。全容は以下のキャプチャの通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/08d147cd-48f4-0009-bc27-2ca83b2e8d65.png)


今回は、

- ①：ソフトウェア
- ②：ネットワーク
- ③：データベース

の3つに手を入れます。

(7) まず、①ソフトウェアから。
「ログのストリーミング」の「有効」にチェックを入れ、画面下方の「保存」をクリック。
こうしておくことで、ログが見られるようになるので、環境でのエラーの原因を調べる際に便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/630a8c67-c75e-301f-e898-5802be39d858.png)


(8) 続いて、②ネットワーク。
パブリックIPアドレス（①）、アベイラビリティーゾーン（②）の左隣のチェックボックスにチェックし、「保存」をクリック（③）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/738dce01-fca1-112f-1208-39d3d6a8079d.png)

(9) 最後にデータベース。
ユーザー名（①）、パスワード（②）を設定し、保存をクリック（③）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f6786c8e-d4fb-87b6-b753-7dc2ef413636.png)

(10)「より多くのオプションの設定」画面にて、「環境の作成」をクリック

(11) 10分ほどして環境が作成されたら、「ヘルス」が「OK」となっていることを確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/07b05891-b3a5-df91-aa60-e3beb0ba68b9.png)

(12) もし、「ヘルス」が黄色（Warning）や赤色（Degraded、Severe）となった場合は原因を特定＆解決しておきましょう。
ナビゲーションペインにて、「ログ」や「ヘルス」をクリックすると内容を確認できます。

#### [2] 追加設定
(1) 追加設定もしておきしょう。Elastic Beanstalkのナビゲーションペインの「設定」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e9dd04f2-359a-20c0-f1c6-12629f3a40ba.png)

(2)「インスタンス」の右側の「編集」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/abf4c6cf-6976-7387-a908-63e7e1eb4da8.png)

(3)「デフォルト」にチェックを入れ（①）、「適用」をクリック（②）。
~~<b>【重要】忘れると、通信がうまくいかず、502（Bad Gateway）となりますので、必ず設定してください。</b>~~
→ この設定はなくても大丈夫でした。502（Bad Gateway）はサーバーのポート番号の設定ミスにより起こるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/10234622-e2b3-d592-185e-e3c2c190f3f2.png)

### 4. データベースの設定
続いて、3. Elastic Beanstalk環境の作成によってできた、データベース（RDS）の設定を行いましょう。
#### [1] RDSにおける接続設定
(1) マネジメントコンソールにて、RDSを探し、クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/0064959c-7da8-3306-73fb-170b058ca897.png)

(2) ナビゲーションペインにて、「データベース」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/fc2d2bc0-55e3-b939-a934-0699f23256f4.png)

(3) 作成されたデータベースインスタンスのラジオボタンにチェックを入れ（①）、「変更」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/4f1490c8-e8a2-2660-764f-4c58244498b8.png)

(4) データベースインスタンスの変更画面に遷移するので、「ネットワーク＆セキュリティ」欄の「パブリックアクセシビリティ」を「はい」にし、画面下方の「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/dc1d8f7b-b387-0029-681e-e87775602d41.png)

(5)「変更の概要」画面に遷移したら、内容を確認し、「変更のスケジュール」の「すぐに適用」を選択し（①）、「DBインスタンスの変更」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/439dce8a-db19-72ac-20bf-a96d8c160d0d.png)

(6)「データベース」画面に戻ったら、データベースインスタンス名の上のリンクをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/d1470960-b583-b707-09fa-e358d0e96014.png)

(7) 「接続とセキュリティ」タブにて、「VPCセキュリティグループ」（リンク）をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/72a89a92-1cf4-d9df-26aa-798a29913a53.png)

(8)「セキュリティグループ」画面に遷移したら、「インバウンドルール」タブをクリックし（①）、「インバウンドルールを編集」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/86e0c652-31aa-2c0b-e207-24bec7d530c7.png)

(9)「任意の場所」を選択し（①）、「ルールを保存」をクリック（②）。
<b>【注意】この設定内容は全ての接続元からのアクセスを許可してしまうため、セキュリティ上よくありません。</b>
今回は無線LANを使ってクライアントPCからの接続も行うため、この設定としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/7a763aeb-8e38-06f4-89e2-cd609505a828.png)

#### [2] テーブルの作成
(1) 続いて、接続確認も兼ねて、クライアントPCから、テーブルの作成を行いましょう。
コマンドプロンプトを起動し、以下のコマンドを実行、データベースインスタンスへ接続します。

```sql:実行コマンド
> mysql -h ホスト名-P ポート番号 -u ユーザー名 -p
```

ここで、ホスト名は以下のキャプチャの「エンドポイント」（①）、ポート番号はか「ポート」（②：デフォルトは3306）、ユーザー名は3. Elastic Beanstalk環境の作成で設定した「ユーザー名」になります（今回はadmin）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/6e1b819f-5cbc-89e9-a645-0aec10d0f96f.png)

コマンド実行後、パスワードを聞かれるので、Elastic Beanstalk環境の作成で設定した「パスワード」を入力し、Enter。

ログインできたら、以下のDDL、SQLを実行し、データベース、テーブルの作成、ならびに、データの挿入を行っておきましょう。

```sql:データベースとテーブルの作成
CREATE DATABASE `sample-db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;

USE `sample-db`;

CREATE TABLE `shop_informations` (
  `shop_id` mediumint(9) NOT NULL AUTO_INCREMENT COMMENT '店舗ID',
  `shop_name` varchar(100) DEFAULT NULL COMMENT '店舗名',
  `tel` varchar(15) DEFAULT NULL COMMENT '電話番号',
  `zip_code` varchar(10) DEFAULT NULL COMMENT '郵便番号',
  `address` varchar(100) DEFAULT NULL COMMENT '住所',
  `access` varchar(100) DEFAULT NULL COMMENT 'アクセス',
  `business_hour` varchar(100) DEFAULT NULL COMMENT '営業時間',
  `regular_holiday` varchar(100) DEFAULT NULL COMMENT '定休日',
  PRIMARY KEY (`shop_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='店舗情報';
```

```sql：データの挿入
begin;

INSERT INTO shop_informations VALUES(1, '春風カフェ', '03-XXXX-XXXX', '100-0005', '東京都千代田区丸の内・・・', '東京駅から徒歩5分', '平日 7:00～21:00／土日祝 10:00～21:00', '不定休');
INSERT INTO shop_informations VALUES(2, '夏海食堂', '050-XXXX-XXXX', '254-0034', '神奈川県宝町・・・', '平塚駅から徒歩10分', '平日 11:00～22:00／土日祝 11:00～20:00', '火曜日');
INSERT INTO shop_informations VALUES(3, '割譲秋山', '049-XXXX-XXXX', '350-0041', '埼玉県川越市六軒町・・・', '川越市駅から徒歩7分/本川越駅から徒歩5分', '昼 11:00～14:00／夜 18:00～23:30', '日曜・祝日');
INSERT INTO shop_informations VALUES(4, '冬空キッチン', '04-XXXX-XXXX', '350-0041', '千葉県我孫子市本町・・・', '我孫子駅から徒歩8分', '昼 11:30～14:00／夜 17:00～23:00', '木曜日');

commit;
```

※上記データは、架空のものになります。実在する店舗ではありません。

#### [3] Elastic Beanstalkにおける設定
(2) 続いて、Elastic Beanstalkにて、データベース接続用の環境変数を追加します。
マネジメントコンソールにて、Elastic Beanstalkを探してクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/63fa99a0-5317-e4b4-ee30-c5be8c2a6945.png)

(3) 「ソフトウェア」の右端の「編集」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/270a2f7a-df07-380d-f743-7cf4e38595fb.png)

(4) 「環境のプロパティ」欄にて、以下のように設定し（①）、「適用」をクリック（②）。

|名前|値|
|---|---|
|DB_HOST|(10)で入力したホスト名|
|DB_PORT|(10)で入力したポート番号|
|DB_NAME|(10)で作成したデータベース名|
|DB_USER|(10)で入力したユーザー名|
|DB_PASSWORD|(10)で入力したパスワード|
|SERVER_PORT|5000|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/fe8c1b5d-e65c-94f7-ce01-097e4838d7d9.png)

(5) 「1. Java（Spring Boot）アプリケーションの作成」で作成したapplication.ymlの内容を以下のように書き換えます。

```yaml:application.yml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://${DB_HOST:(10)で入力したホスト名}:${DB_PORT:(10)で入力したポート番号}/${DB_NAME:(10)で作成したデータベース名}?serverTimezone=JST
    username: ${DB_USERNAME:(10)で入力したユーザー名}
    password: ${DB_PASSWORD:(10)で入力したパスワード}
  jpa:
    database: MYSQL
    hibernate.ddl-auto: none
server:
  port: ${SERVER_PORT:5000}
```

こうすることで、クライアントPCから、今回作成したデータベースに接続することができるようになります。

(6) Eclipseにて、作成したプロジェクト上で右クリックし（①）、「実行」（②） > 「Spring Bootアプリケーション」（③）をクリックして、ローカルサーバーを起動しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/886cbae8-00c8-9a22-6328-4cea8ec79a52.png)

(7) ブラウザを立ち上げて、以下のURLを叩き、結果が取得できることを確認します。

```:実行URL
http://localhost:5000/shop-information/1
```

(8) application.ymlの変更内容をGitのリモートリポジトリ（CodeCommit）にも反映させます。
コマンドプロンプトを起動して、プロジェクトのルートディレクトリまで移動し、以下の順でコマンドを実行。

```
> git add application.yml
> git commit -m "fix application.yml"
```

## 続編について
続きは、

- [【CodePipeline×ElasticBeanstalk】JavaアプリケーションをCodePipelineでElasticBeanstalkにCI/CDする その3](https://qiita.com/C_HERO/items/62e8344f3b3de6f464b4)

にて。
5. パイプラインの作成の接続設定と6. 後片付けを行います。

## 更新履歴

- 2020/08/13：「3. Elastic Beanstalk環境の作成」の[1] 環境、アプリケーションの新規作成、[2] 追加設定の内容を一部変更

## 参考
### 手順
#### 3. Elastic Beanstalk環境の作成
- [Elastic Beanstalk 環境を作成する | aws](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.environments.html)
- [状態の色とステータス | aws](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/health-enhanced-status.html)
- [Elastic Beanstalk 環境で黄色または赤のヘルスステータス警告を解決する方法を教えてください。 | aws](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-beanstalk-yellow-warning/)
- [【AWS, VPC】通信エラーと戦う中で、デフォルトセキュリティグループの仕組みを学んだ話 | Qiita](https://qiita.com/Ushinji/items/6b17717d4f48ca50aa58)

#### 4. データベースの接続設定
- [VPC のパブリックサブネットまたはプライベートサブネットを使用する Amazon RDS インスタンスへの接続問題を解決するには、どうすれば良いですか? | aws](https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-connectivity-instance-subnet-vpc/)