Enterprise Distributed Application Service (EDAS) アプリケーションがスケールアウトする際、新しく作成された Elastic Compute Service (ECS) インスタンスが既存のインスタンスとは異なる Java 開発キット (JDK) バージョンを取得することがあります。この不一致は、ビジネスコードで実行時エラーを引き起こす原因となります。
これを防ぐには、特定の JDK バージョンを固定する起動前マウントスクリプトを追加します。一度設定すれば、既存のインスタンスも新しくスケールアウトされたインスタンスも、すべて同じ JDK を実行するようになります。
JDK バージョンのずれが発生する理由
EDAS は、クラスターにインポートされた各 ECS インスタンスに最新の OpenJDK をインストールします。時間が経つにつれて、「最新」のバージョンは変化します。数ヶ月前に作成されたインスタンスは古い JDK を実行し続けますが、スケールアウト時に追加されたインスタンスは現在のバージョンを取得します。
起動前マウントスクリプトは、アプリケーションが開始する前に、指定した正確な JDK バージョンをダウンロードしてインストールすることで、この問題を解決します。このスクリプトはインスタンスの起動ごとに実行されるため、すべてのインスタンスが同じバージョンに収束します。
注:特定のバージョン (例:8u202) に固定すると、インスタンスは JDK の自動更新を受け取らなくなります。セキュリティパッチを適用するために、定期的な手動更新を計画してください。起動前スクリプト
以下のスクリプトは、ターゲットの JDK がすでにインストールされているかどうかを確認します。インストールされていない場合、内部の Object Storage Service (OSS) URL からパッケージをダウンロードし、展開して、ファイル権限を設定します。
JDK_DOWNLOAD_URL="http://doctest.oss-cn-hangzhou-internal.aliyuncs.com/tmp/oracle-jdk-8u202-linux-x64.tar.gz"
JDK_DOWNLOAD_TMP_FILE="/tmp/oracle-jdk-8u202.tar.gz"
JDK_HOME="/opt/edas/jdk"
JAVA_HOME="${JDK_HOME}/java"
if [ ! -f "${JAVA_HOME}/bin/java" ]; then
rm -rf ${JAVA_HOME} && mkdir -p ${JDK_HOME}
wget -q --dns-timeout=2 --connect-timeout=3 --read-timeout=30 ${JDK_DOWNLOAD_URL} -O ${JDK_DOWNLOAD_TMP_FILE}
[ -f "${JDK_DOWNLOAD_TMP_FILE}" ] && tar zxf ${JDK_DOWNLOAD_TMP_FILE} -C ${JDK_HOME} && rm -f ${JDK_DOWNLOAD_TMP_FILE}
[ -n "$(ls -ld ${JDK_HOME}/jdk* 2>/dev/null)" ] && mv ${JDK_HOME}/jdk* ${JAVA_HOME}
fi
chmod -R 755 ${JAVA_HOME}JDK_DOWNLOAD_URL の値を、ご利用の JDK パッケージの内部 OSS URL に置き換えてください。以下のセクションでは、URL の準備方法と EDAS コンソールへのスクリプトの追加方法について説明します。
| 変数 | 説明 |
|---|---|
JDK_DOWNLOAD_URL | JDK パッケージの内部 OSS ダウンロード URL |
JDK_DOWNLOAD_TMP_FILE | ダウンロードしたアーカイブのための一時的なローカルパス |
JDK_HOME | JDK インストール先の親ディレクトリ (/opt/edas/jdk) |
JAVA_HOME | EDAS が使用する最終的な JDK パス (/opt/edas/jdk/java) |
前提条件
開始する前に、以下が揃っていることを確認してください:
特定の JDK バージョンに固定したい EDAS ECS アプリケーション
ローカルマシンにダウンロードされた JDK パッケージ (例:
oracle-jdk-8u202-linux-x64.tar.gz)ECS インスタンスと同じリージョンにある OSS バケット
ステップ 1:JDK パッケージの OSS へのアップロード
ECS インスタンスと同じリージョンにある OSS バケットに JDK パッケージをアップロードします。詳細については、「オブジェクトのアップロード」をご参照ください。
アップロードしたパッケージのダウンロード URL を取得します。詳細については、「オブジェクトの共有」をご参照ください。
ECS インスタンスが内部ネットワーク経由でパッケージをダウンロードできるように、URL のホスト名に
-internalを挿入します。例:http://doctest.oss-cn-hangzhou-internal.aliyuncs.com/tmp/oracle-jdk-8u202-linux-x64.tar.gz内部エンドポイントを使用すると、パブリック帯域幅の料金を回避でき、より高速です。
ステップ 2:EDAS コンソールへのスクリプトの追加
EDAS コンソールにログインします。
左側のナビゲーションウィンドウで [アプリケーション] をクリックします。上部のナビゲーションバーで、リージョンを選択します。[アプリケーション] ページの上部で、ECS アプリケーションが属するマイクロサービス名前空間を選択します。
対象の ECS アプリケーションの名前をクリックします。
[基本情報] タブの [アプリケーション設定] セクションで、[マウントスクリプト] をクリックします。
[マウントスクリプト] ダイアログボックスで、[起動前スクリプト] セクションに移動します:
JDK のインストールが失敗した場合にアプリケーションが起動しないように、[失敗を無視] をオフにします。
「起動前スクリプト」セクションのスクリプトを貼り付けます。
JDK_DOWNLOAD_URLの値を、ステップ 1 で取得した内部 OSS URL に置き換えます。
[変更] をクリックします。

ステップ 3:JDK バージョンの確認
ECS アプリケーションを再起動して、マウントスクリプトを適用します。
アプリケーションの再起動後、EDAS コンソールに表示される JDK バージョンを確認します。

(任意) ECS インスタンスにログインし、
java -versionを実行して、インストールされたバージョンがターゲットバージョンと一致することを確認します。
OpenJDK および代替 JDK ベンダー
fontconfig を使用する OpenJDK:特定のバージョンの OpenJDK を使用する場合、JDK のインストールコマンドの前に、起動前スクリプトに
yum install -y fontconfigを追加します。fontconfig ライブラリは、特定の Java アプリケーションでのフォントレンダリングに必要です。JDK 11 または他のベンダー:JDK 11 または他のベンダーの JDK ディストリビューションを使用するには、マウントスクリプトを構成して、JDK を
/opt/edas/jdk/javaまたは/opt/ali/alijdkのいずれかにインストールします。