2020年4月11日に、Elastic BeanstalkのJava SEプラットフォームで、Corretto 11(Java 11)プラットフォームブランチの一般提供(GA)が開始されました。
- LTS(長期サポート)バージョンはJDK11
- Amazon CorrettoでもCorretto 8のサポート期限が最短2023年6月までなのに対し、Corretto 11は最短2024年8月までと長い
ことからも早めにランタイムバージョンの更新対応しておきたいところですね。
というわけで、今回は、ElasticBeanstalkのJava SE環境をJava 8(Corretto 8ではないほう)からCorretto 11にバージョンアップする手順をまとめてみました。
環境
- OS:Windows10
- IDE:Eclipse 2020-03
- JDK:Amazon Correto 8 → Amazon Correto 11
- フレームワーク:Spring Boot
- AWS
- CodePipeline
- CodeCommit
- CodeBuild
- CodeDeploy
- Elastic Beantalk
- Java SE:Java 8 バージョン 2.10.8 → Corretto 11 バージョン 3.0.3
- RDS:MySQL Community Edition(バージョン8.0.17)
- CodePipeline
前提条件
本記事は、
【CodePipeline×ElasticBeanstalk】JavaアプリケーションをCodePipelineでElasticBeanstalkにCI/CDする その3 | Qiita
の続編的ポジションになります(手順6の跡片付けは実施しない)。
Java 8 バージョン 2.10.8プラットフォームの環境は作成済を想定&似た内容の作業については省略記載している箇所があります。
あらかじめ、ご了承ください。
手順
1. JDKのAmazon Corretto 8 → Amazon Corretto 11へのバージョンアップ
まず、ローカル環境にて、JDKをAmazon Corretto 8から、Amazon Corretto 11にバージョンアップし、動作確認とエラーの解消を行います。
[1] 事前準備
(1) まず、Amazon Corretto 8が適用された状態で対象プロジェクトをクリーンしましょう。
メニューバーの「プロジェクト」(①) > 「クリーン」(②)をクリック。
(2) 対象のプロジェクトにチェックを入れ(①)、「クリーン」をクリック(②)。
(3) クリーン完了後、以下の事項を確認してください。
- ① エラーが出ていないこと
- ② アプリケーションが正常に起動、動作すること
を確認しておいてください。
① エラーについては、メニューバーの「ウィンドウ」(①) > 「ビューの表示」(②) > 「問題」(③)をクリックすると出てくる、「問題」タブ(④)にて確認できます。
なお、上記のエラーはEclipse自体の障害で、アプリケーションの構築や挙動には影響しない、とのことなので、出ていても問題ありません。
② アプリケーションの起動方法は以下の通り。
プロジェクト上で右クリック(①) > 「実行」(②) > 「Spring Boot アプリケーション」(③)。
その後、アプリケーションが正常に動作することを確認します。
(4) 次に、プロジェクトが意図しないうちにビルドされてしまいわないようにするため、設定の変更を行います。
メニューバーの「プロジェクト」をクリックし(①)、「自動的にビルド」のチェックを外します(②)。
(5) もうひとつ必要な設定変更を行いましょう。
メニューバーの「ウィンドウ」 > 「設定」の順でクリックしたら、「実行/デバッグ」(①) > 「起動」(②)の「起動前に(必要に応じて)ビルド」のチェックを外して(③)、「適用して閉じる」をクリック(④)。
これで、JDKバージョンアップの事前準備は完了です。
[2] Amazon Corretto 11のインストールと適用
次に、Amazon Corretto 11をインストールして、Eclipseに適用しましょう。
(1) Amazon Corretto 11をインストールします。
Amazon Corretto 11 のダウンロード | aws
より、インストーラをダウンロード&ダブルクリックして起動しましょう。
(2) ウィザードが立ち上がったら基本デフォルトのまま進めてもらえば大丈夫ですが、「Custom Setup」画面まできたら、JDKのバージョンが「Amazon Corretto JDK 11 distribution」(①)となっていることを確認しておきましょう。
デフォルトのインストール先はProgram Files下のAmazon Correttoフォルダの直下になります(②)。
(3) インストールが完了したら、Eclipseの「インストール済のJRE」を変更します。
Eclipseにて、メニューバーの「ウィンドウ」(①)> 「設定」の順でクリック(②)。
(4) 「設定」ウィンドウが立ち上がったら、「Java」(①) > 「インストール済みのJRE」(②) > 「追加」(③)の順でクリック。
(5) 「JREの追加」画面が立ち上がったら、「標準VM」を選択し(①)、「次へ」をクリック(②)。
(6) 「JREの編集」画面が立ち上がったら、「ディレクトリ」ボタンをクリックして(①)インストールしたJDK(Amazon Corretto 11)のフォルダを選択し(②)、任意のJRE名をつけて(③)、「完了」をクリック(④)。
(7) 追加したJDKにチェックを入れ(①)、「適用して閉じる」をクリック(②)。
[3] JDK 8 (Amazon Corretto 8)でビルドしたアプリケーションをJDK11(Amazon Corretto 11)で実行
Amazon Corretto 11の適用が完了したら、再ビルドする前、すなわち、 JDK 8 (Amazon Corretto 8)でビルドしたものを使って動作確認を行いましょう。
確認観点は、
- アップグレードの必要なライブラリがないか、確認する
ことになります。
(1) Eclipse上で対象のアプリケーションを起動します。
(2) アプリケーションが正常に起動したら、念のため、動作確認前にコンパイル時のJDKのバージョンを確認しておきます。
コマンドプロンプトで、対象プロジェクトのbin配下の任意のclassファイルに対し、Javaバージョン確認コマンドを実行。
以下のようなフォルダのクラスファイルに実行する場合は下記の通り。
> cd C:\pleiades-2020-03\workspace\sample-eb-java\bin\main\jp\co\sample_eb_java\domain\service
> javap -v ShopInformationService.class
Classfile /C:/pleiades-2020-03/workspace/sample-eb-java/bin/main/jp/co/sample_eb_java/domain/service/ShopInformationService.class
Last modified 2020/08/12; size 1957 bytes
MD5 checksum b6712daccce6cad8628e31007340fcca
Compiled from "ShopInformationService.java"
public class jp.co.sample_eb_java.domain.service.ShopInformationService
minor version: 0
major version: 52
・・・(以下、省略)
「major version: 52」となっていれば、OK!
ちなみに、JDK 11の場合は、「major version: 55」になります。
(3) 動作確認をしましょう。挙動がJDK 8でビルドし&アプリケーションを起動し、動作させた時と異なる場合は修正を行います。(今回は大丈夫でした。)
[4] JDK 11 (Amazon Corretto 11)でビルドしたアプリケーションをJDK11(Amazon Corretto 11)で実行
続いて、JDK 11 (Amazon Corretto 11)でビルドしたアプリケーションをJDK11(Amazon Corretto 11)で実行します。
確認観点は、
- 廃止されたAPI等が使用されていないか確認すること
になります。
(1) まず、build.gradleのsourceCompatibilityを1.8 → 11に変更します。
この設定値は、gradleでビルドされる際に使用されるJavaのバージョンになり、記述しない場合は適用されているJDKのバージョンでビルドされます。
plugins {
id 'org.springframework.boot' version '2.3.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'io.code_check.challenge_server'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
・・・(以下、省略)
plugins {
id 'org.springframework.boot' version '2.3.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'io.code_check.challenge_server'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
・・・(以下、省略)
(2) 保存したら、「build.gradle」上で右クリック(①) > 「Gradle」(②) > 「Gradleプロジェクトのリフレッシュ」(③)をクリックして、依存関係の更新をしておきます。
(3) .settings/org.eclipse.jdt.core.prefsを以下の通り編集します。
※Eclipse上では表示されませんが、対象プロジェクトのルートディレクトリを直接参照するとあります。
こちらはEclipse上でのコンパイル時にどのバージョンのJDKに準拠するか、という内容を表しています。
そのままだと、ローカル環境での編集時に意図しないJavaのバージョンでコンパイルされてしまいますのでこちらも変更しておきましょう(AWS上の環境には影響のない認識)。
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.source=1.8
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.source=11
(4) 「build.gradle」の「sourceCompatibility」に対するJDKバージョン変更により、.classpathの内容も以下の通り変更されるはずですので、確認しておきましょう。
こちらはEclipseが内部的に参照しているファイルで、AWS上の環境には影響のない認識です。
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11/"/>
(5) プロジェクトをクリーンします。
(6) エラーの確認を行います。
「問題」タブを確認し、新たなエラーが出ていないことを確認します。
エラーが発生した場合はメッセージの内容を参考に修正を行いましょう(こちらも今回は大丈夫でした。)
(7) 対象のプロジェクト上で右クリックし、アプリケーションを起動します。
(8) アプリケーションが正常に起動したら、今回も、動作確認前にコンパイル時のJDKのバージョンを確認しておきましょう。
コマンドプロンプトで、プロジェクトのbin配下の任意のclassファイルに対し、Javaバージョン確認コマンドを実行。
> cd C:\pleiades-2020-03\workspace\sample-eb-java\bin\main\jp\co\sample_eb_java\domain\service
> javap -v ShopInformationService.class
Classfile /C:/pleiades-2020-03/workspace/sample-eb-java/bin/main/jp/co/sample_eb_java/domain/service/ShopInformationService.class
Last modified 2020/08/12; size 1957 bytes
MD5 checksum b6712daccce6cad8628e31007340fcca
Compiled from "ShopInformationService.java"
public class jp.co.sample_eb_java.domain.service.ShopInformationService
minor version: 0
major version: 55
・・・(以下、省略)
「major version: 55」となっていれば、OKです!
(9) 動作確認をして、想定の結果と異なる場合は対象箇所を修正します。(こちらも今回は大丈夫でした。)
(10) Elastic Beantalkの環境作成時用にjarファイルを作成します。
プロジェクトのルートディレクトリに移動し、ビルドコマンドを実行。
> cd C:\pleiades-2020-03\workspace\sample-eb-java
> gradlew build
結果が「BUILD SUCCESSFUL」となればOK!
(11) build/libs配下にjarファイルが作成されていることを確認しましょう。
(これを環境作成時に使用します。)
2. Elastic BeanstalkでCorretto 11環境の作成
続いて、Elastic BeanstalkでCorretto 11プラットフォームの環境を作成します。
(1) AWSマネジメントコンソールにログインし、Elastic Beanstalkを開いたら、ナビゲーションペインにて、「アプリケーション」をクリック、corretto 11プラットフォームの環境を作成したいプロジェクトのラジオボタンを押して(②)「アクション」(③) > 「環境の作成」(④)。
(2) 「ウェブサーバー環境」を選択し(①)、「選択」をクリック(②)。
(3) 以下の通り設定し、「より多くのオプションの設定」をクリック(⑨)
No | 名称 | 設定内容 |
---|---|---|
① | 環境名 | 任意の名前を入力(既存のものと異なるもの) |
② | プラットフォーム | Java |
③ | プラットフォームのブランチ | Corretto 11 running on 64bit Amazon Linux 2 |
④ | プラットフォームのバージョン | 3.1.0:Recommendedとなっているもの |
⑤ | アプリケーションコード | 「コードのアップロード」を選択 |
⑥ | バージョンラベル | 任意の名前を入力(既存のものと異なるもの) |
⑦ | ソースコード元 | 「ローカルファイル」を選択し、1-(9)、(10)で作成したjarファイルをアップロード |
⑧ | ファイルの選択 | 1-(9)、(10)で作成したjarファイルをアップロード |
(4) 「より多くのオプションの設定」では、
- ① ソフトウェア
- ② ネットワーク
の設定を行います。
①「より多くのオプションの設定」画面に遷移したら、「ソフトウェア」の「編集」ボタンをクリックして、「ソフトウェアの変更」画面にて、以下の通り設定し、「保存」をクリック(③)。
No | 名称 | 設定内容 |
---|---|---|
① | ログのストリーミング | 「有効」にチェック |
② | 環境プロパティ | 既存のJava 8プラットフォームと同じ内容を設定(同じRDSを使用します) |
② 次に、「ネットワーク」の「編集」ボタンをクリックして、「ネットワークの変更」画面にて以下の通り設定し、「保存」をクリック(③)。
No | 名称 | 設定内容 |
---|---|---|
① | パブリックIPアドレス | チェックを入れる |
② | アベイラビリティーゾーン | チェックを入れる |
(3) 「より多くのオプションの設定」画面に戻ったら、場面右下の「環境の作成」をクリックして環境を作成しましょう。
(4) しばらくすると環境が作成されます。
ヘルスが「OK」となっていればOK!
3. CodePipelineの再設定
今後、「2. Elastic BeanstalkでCorretto 11環境の作成」で作成された環境に正しくデプロイされるよう、CodePipelineの設定を見直します。
[1] CodeBuildのBuildSpec
(1) マネジメントコンソールにて、CodeBuildを開き、Java 8プラットフォームにCI/CDする際に使用しているビルドプロジェクトを選択し、「編集」(②) > 「BuildSpec」(③)をクリック。
(2) 以下のように、ビルドコマンドのjavaをcorretto8 → corretto11に変更し(①)、「buildspecの更新」をクリック(②)。
version: 0.2
phases:
install:
runtime-versions:
java: corretto8
build:
commands:
- ./gradlew build
version: 0.2
phases:
install:
runtime-versions:
java: corretto11
build:
commands:
- ./gradlew build
[2] CodePipelineのデプロイ先
(1) マネジメントコンソールにて、CodePipelineを探して開いたら、対象のパイプラインをクリック。
(2) 対象のパイプラインの画面に遷移したら、「編集する」をクリック。
(3) 「編集する:Deploy」の「ステージを編集する」をクリックし(①)、「編集」ボタンをクリック(②)。
(4) 「アクションを編集する」画面に遷移したら、「環境名」を「2. Elastic BeanstalkでCorretto 11環境の作成」で作成した環境名に変更し(①)、「完了」をクリック(②)。
(5) 「保存する」ボタンをクリックして、変更内容を保存します。
(6) 「1. JDKのAmazon Corretto 8 → Amazon Corretto 11へのバージョンアップ」でbuild.gradleの内容を変更しているはずなので、コミット、プッシュしてパイプラインを実行しましょう。
以下のようにデプロイまで成功したら(①)、「AWS Elastic Beanstalk」をクリック(②)。
(7) Elastic Beanstalkの「環境」画面に遷移するので、対象の環境をクリック。
(8) 「ヘルス」が「OK」となっていることを確認し、ドメイン(②)にてアプリケーションが正しく動作することを確認します。
4. 環境URLのスワップ
環境URLのスワップ、すなわち、既存のJava 8プラットフォームと今回作成したCorretto 11プラットフォームのURLの入れ替えを行います。
これにより、アプリケーションのURLを変更する必要がなくなります。
(1) コンソールにて、Elastic Beantalk画面に移動し、「環境」メニューにて、Java 8環境のラジオボタンにチェックを入れ(①)、「アクション」(②) > 「環境URL」のスワップをクリック(③)。
(2) 「スワップする環境の選択」の「環境名」にて、「2. Elastic BeanstalkでCorretto 11環境の作成」で作成した環境を選択し(①)、「スワップ」をクリック(②)。
(3) 作業が完了したら、Corretto 11プラットフォームに移動し、赤枠内のURLがJava 8プラットフォームのものだったURLに変更されていることを確認してください。
(4) 念のため、入れ替え後のドメインで、動作確認を行っておきましょう。
5. RDSインスタンスの分離
続いて、RDSインスタンスをJava 8プラットフォームから分離し、環境を終了してもRDSが削除されないようにします。
(1) マネジメントコンソールにて、RDSを探して遷移し、ナビゲーションペインにて「データベース」をクリックした後、対象のDBインスタンス(Java 8プラットフォームに内包されている)のラジオボタンにチェック(①) > 「アクション」(②) > 「スナップショットの取得」をクリック(③)。
(2) 任意のスナップショット名を入力し(①)、「スナップショットの取得」をクリック(②)
(3) 「スナップショット」画面にて、スナップショットが作成されたことを確認します。
(4) ナビゲーションペインにて、「データベース」をクリックし(①)、対象のDBインスタンスのラジオボタンにチェックを入れ(①)、「変更」をクリック(③)。
(5) 「削除保護の有効化」にチェックを入れ(①)、「次へ」(②)。
(6) 内容を確認し、「DBインスタンスの変更」をクリック。
6. Java 8環境の削除
(1) 不要になったJava 8環境を削除します。
Elastic Beanstalkのナビゲーションペインにて「環境」をクリックした後、Java 8環境のラジオボタンにチェックを入れ(①)、「アクション」(②) > 「環境の終了」をクリック(③)。
(2) Java 8環境が終了されたのち、データベースインスタンスが削除されていないことを確認し、Corretto 11のドメインにて、再度動作確認を行っておきましょう。
7. 後片付け
[1] Corretto 11プラットフォーム環境の削除
(1) 「6. Java 8環境の削除」と同じ要領で環境を削除します。
[2] RDSインスタンスの削除
「5. RDSインスタンスの分離」で、Elastic Beanstalk環境からデータベースインスタンスを分離しているため、このままでは削除されません。
以下の手順で実施します。
(1) マネジメントコンソールにて、RDSに遷移し、ナビゲーションペインにて、「データベース」をクリックした後、対象のDBインスタンスのラジオボタンにチェックを入れ(①)、「変更」をクリック(②)。
(2) 「削除保護の有効化」のチェックを外し(①)、「次へ」(②)。
(3) 「変更の概要」を確認し(①)、「すぐに適用」を選択し(②)、「DBインスタンスの変更」をクリック(③)。
(4) 「データベース」画面に戻ったら、対象のRDSインスタンスのラジオボタンにチェックを入れ、「アクション」(②) > 「削除」をクリックして削除します(③)。
更新履歴
- 2020/08/20:手順1. JDKのAmazon Corretto 8 → Amazon Corretto 11へのバージョンアップに、org.eclipse.jdt.core.prefsの設定変更を追加
- 2020/08/21:手順1. JDKのAmazon Corretto 8 → Amazon Corretto 11へのバージョンアップに、.classpathの設定変更を追加
- 2020/09/06:Corretto 11(Java 11)プラットフォームブランチの一般提供(GA)が開始日を2020/06/03 → 2020/04/11に訂正。
※AWS Elastic Beanstalk で Amazon Linux 2 ベースの Tomcat プラットフォームの一般提供を発表 | aws
の内容から勘違いをしておりました。
正しくは、
Corretto on Amazon Linux 2 platform(aws/elastic-beanstalk-roadmap) | GitHub
の通り、2020/04/11でしたので、訂正いたしました。失礼しました。
参考
- Java SE プラットフォーム履歴 | aws
- Javaのサポート期間 | Qiita
- Amazon Corretto のよくある質問 | aws
- Corretto on Amazon Linux 2 platform(aws
/
elastic-beanstalk-roadmap) | GitHub
手順
1. JDKのAmazon Corretto 8 → Amazon Corretto 11へのバージョンアップ
- Oracle JDK 移行ガイド(リリース11) | Oracle Help Center
Spring Boot 2.0.x の Web アプリを 2.1.x へバージョンアップする ( その15 )( JDK を 8u202 → 11.0.2+9 に変更する ) | かんがるーさんの日記- 未使用のデータベース・ドライバーに関するエラーが表示される | IBM Support
- Eclipseの自動的にビルドについて | stack overflow
- フォーマッター・アプリケーションの構成ファイルの生成 | IBM
- 設定を作ったとき onPreferenceChange でエラーが出る。 | Qiita
- EclipseがコンパイラをJava 8に切り替えないのはなぜですか? | it-swarm.dev
- プロジェクトのファイル構成 | Let'sプログラミング
- Java classファイルがどのバージョンでコンパイルされたのかを調べる | Rutakeの技術メモ
- Javaバージョン | ひしだまの変更履歴
- GradleでEclipseとIntellij IDEAの開発環境を作る | 猫好きモバイルアプリケーション開発者記録