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

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

## 環境
- 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）


## 手順
### 5. パイプラインの作成

いよいよ最終段階。
CodePipelineを作成して、Elastic Beanstalk環境にデプロイします。

#### [1] CodePipelineの作成
(1)マネジメントコンソールにて、CodePipelineを探し、クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/21133204-c01b-52f7-1883-aa8b636fdfe6.png)

(2)「パイプラインを作成する」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e0f1d443-5bff-55ef-9994-36fa73038325.png)

(3)「パイプラインの設定を選択する」画面に遷移したら、「パイプライン名」を入力し（①）、「新しいサービスロール」を選択し(②：デフォルト）、「次に」をクリック（③）。
これにより、パイプライン作成時に「ロール名」に記載のロールが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e723e27f-2c52-4139-dfc1-db858862e155.png)

(4)次に、「ソースステージを追加する」画面です。
以下の通り入力・選択し、「次に」をクリック（⑤）

|No|名称|設定内容|
|---|---|---|
|①|ソースプロバイダー|AWS CodeCommit|
|②|リポジトリ名|手順2：Gitリポジトリの作成で作成したリポジトリ名|
|③|ブランチ名|master|
|④|検出オプションを変更する|Amazon CloudWatch Events（推奨）|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/dffa5531-cc9f-b044-f8df-c6a563978ab7.png)

(5) 続いて、「ビルドステージを追加」画面です。
「プロバイダーを構築する」にて、「AWS CodeBuild」を（①）、「リージョン」は「アジアパシフィック（東京）」を選択し（②）、「プロジェクトを作成する」をクリック（③）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/d49517f8-671f-acfe-52a2-fd04c88d27d2.png)

(6)「ビルドを作成する」ウィンドウが立ち上がります。
以下の通り入力・設定し、「CodePipelineに進む」をクリック。

|No|名称|設定内容|
|---|---|---|
|①|プロジェクト名|任意の名称（今回は「sample-eb-java-build」）|
|②|環境イメージ|マネージド型イメージ|
|③|オペレーティングシステム|AmazonLinux 2|
|④|ランタイム|Standard|
|⑤|イメージ|aws/codebuild/amazonlinux2-x86_64-standard:3.0|
|⑥|イメージのバージョン|最新のものを選択|
|⑦|環境タイプ|Linux|
|⑧|サービスロール|新しいサービスロール|
|⑨|ロール名|自動で入力される（必要に応じて変更）|
|⑩|ビルド仕様|ビルドコマンドの挿入|
|⑪|ビルドコマンド|※の通り入力|
|⑫|入力モード|エディタ（キャプチャは「エディタに切り替え」をクリックしてエディタでの編集モードになっている状態）|


```yml:※ビルドコマンドの内容
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto8
  build:
    commands:
       - ./gradlew build
```

上記は、javaのcorretto8をインストールして、ビルドを実施する、という内容になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/121579f0-93f9-63e4-5bf0-dbc26a437db2.png)

(6) 「ビルドステージを追加する」画面に戻ったら、「CodeBuildで<プロジェクト名>が正常に作成されました。」となっていることを確認し（①）、「次に」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/df21d5df-3c7e-aad7-be0e-25fe8985b9aa.png)

(7) 「デプロイ - オプショナル」画面に遷移したら、以下の通り入力・選択し、「次に」（⑤）をクリック。

|No|名称|設定内容|
|---|---|---|
|①|デプロイプロバイダー|AWS Elastic Beanstalk|
|②|リージョン|アジアパシフィック（②）|
|③|アプリケーション名|「3. Elastic Beanstalk環境の作成」で作成したアプリケーション|
|④|環境名|「3. Elastic Beanstalk環境の作成」で作成した環境|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/4af2e9fd-1ffa-2cb3-219a-941dbc772b45.png)

(8) 「レビュー」画面に遷移したら、内容を確認し、「パイプラインを作成する」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/53e41259-016e-06a9-c701-2c4df6cd5ad3.png)

(9) パイプラインが作成され、「2. Gitリポジトリの作成」にて、コミット・プッシュされたコードが順に、ビルド、デプロイされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/0576bee0-0585-8e5b-731b-bc1be1e47240.png)

(10) デプロイまで成功（緑色のチェックマークがつく）になったら、OKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/d3451d71-5823-fa1c-432a-d17e781af7e3.png)

今後は、CodeCommitのリポジトリのmasterブランチに変更が加わるたびに、このパイプラインが実行されます。
実環境であれば、子ブランチからプルリク → マージされた場合に実行される形になるでしょう。

もし、パイプライン実行時にエラーが発生した場合は、
[【CodePipeline×Elastic Beanstalk】JavaアプリケーションをCodePipelineでElasticBeanstalkにCI/CDする、のエラーとその対応方法まとめ](https://qiita.com/C_HERO/items/e3c98375d1a659920320)
を参考に解決してみてください。

(11) Elastic Beanstalkの確認もしましょう。
マネジメントコンソールにて、「サービス」（①） > 「Elastic Beanstalk」の順にクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/fbbf39b2-38e1-8751-df16-5882d1c9139b.png)

(12) ナビゲーションペインにて、「環境」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/ba201534-33cd-e82f-80d5-fec2eb230d01.png)

(13) 以下のように、ヘルスが「OK」となっていれば成功です！（①）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/936d2cdd-8546-9448-bceb-2da5def6431a.png)

#### [2] 動作確認
(1) 動作確認をしましょう。
ブラウザにて、以下の通り入力＆Enterして、以下のような結果が返却されれば成功です！

```:実行URL
(2)の②に記載のドメイン/shop-information/1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e2165705-389b-60b7-b873-26252436bd31.png)

## 6. 後片付け
最後に後片付けを行います。
このまま放置しておくと、Elastic Beanstalk環境の作成にて作成された、EC2インスタンス、RDSインスタンスの稼働分だけ、課金されてしまいますので、後片付け（削除）しておきましょう。

#### [1]Elastic Beanstalk
(1) マネジメントコンソールにて、「サービス」（①） > 「Elastic Beanstalk」の順にクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/fbbf39b2-38e1-8751-df16-5882d1c9139b.png)

(2) ナビゲーションペインにて、「環境」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/ba201534-33cd-e82f-80d5-fec2eb230d01.png)

(3) 対象の環境のラジオボタンを選択し（①）、「アクション」 > 「環境の終了」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/a66e5c76-6efe-7d6c-9b0b-a672491f23a9.png)

(4) 「環境の削除の確認」画面に遷移するので、環境の名前を入力し（①）、「削除」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/7ea2984c-a7d8-03eb-50e6-006cfce9299f.png)


(5) 続いて、「アプリケーション」の削除。
Elastic Beanstalkのナビゲーションペインにて、「アプリケーション」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/2b6a7354-884e-3640-28d9-aff3d3bd959a.png)


(6) 対象のアプリケーションのラジオボタンを選択し（①）、「アクション」 > 「アプリケーションの削除」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/0fec2236-baaf-95f0-46b5-eacb13aafe8c.png)

(7)「アプリケーションの削除の確認」のモーダルが立ち上がるので、対象のアプリケーション名を入力し（①）、「削除」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/69e84191-ec54-105c-e509-ebe505fc21c7.png)

#### [2]CodePipeline
(1) 次に、CodePipeline。
少なくとも、コードに変更を行わなければ料金は発生しないのですが、逆を言えば、なんらかの拍子に変更が加わってしまうと料金が発生してしまうので、こちらも削除しておきましょう。

マネジメントコンソールにて、「サービス」（①） > 「Code Pipeline」の順にクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/145d75a3-8c0a-46bf-b04d-114ca618fff0.png)

(2) 対象のパイプラインのラジオボタンを選択し（①）、「パイプラインを削除する」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/bf3de886-c549-fed7-fb71-7306cb206dcc.png)


(3) 削除確認のモーダルが立ち上がるので、「delete」と入力し（①）、「削除」をクリック（②）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/c4264eea-dce9-4351-d4b3-4601fa6d9633.png)


## 終わりに

長時間お疲れさまでした。

自分は、1-[3]-(5)のgradlewの権限変更で3日、そして、5-[1]-(10）のデプロイの段階で3回エラーで躓いて何度も心が折れそうになりました。
だけど、できた時の達成感はハンパない！！
少しでも多くの皆さんのお役に立てばと思い、記事にまとめました。

もし至らない点、気づいた点などあればコメントいただければ幸いです。

## 更新履歴
- 2020/08/21：手順「5. パイプラインの作成」のビルドコマンドの内容を変更


## 参考
#### 5. パイプラインの作成
- [チュートリアル: シンプルなパイプラインを作成する (CodeCommit リポジトリ) | aws](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-simple-codecommit.html)
- [CodeBuild のビルド仕様に関するリファレンス | aws](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html)
- [Gradle Wrapper スクリプト (gradlew) を作成する | まくまくGradleノート](https://maku77.github.io/gradle/gradle-wrapper.html)

#### 6. 後片付け
- [AWS Elastic Beanstalk 料金 | aws](https://aws.amazon.com/jp/elasticbeanstalk/pricing/)
- [AWS CodePipeline 料金 | aws](https://aws.amazon.com/jp/codepipeline/pricing/)