AWSのEC2のインスタンスタイプによって CATALINA_OPTSに記載されているヒープサイズを変えたいということはよくあることだと思います。
ここではお手軽に、インスタンスタイプごとのsetenv.shをS3に用意しておいて、それを起動時シェルで置き換えるという方法を紹介します。
複数のsetenv.shを用意する
まず、利用する可能性があるインスタンスタイプごとのsenenv.shを用意します。
今回はt3.mediumとt5.largeの2パターンを用意します。
ファイル名は{インスタンスタイプ}.setenv.shとつけて下さい。
今回ですと、t3.medium.setenv.shとr5.large.setenv.shとなります。
t3.medium.setenv.sh
t3.mediumはメモリ4GBなので、以下のように2048MBをtomcatに割り当ててみました。
export CATALINA_OPTS="\
${CATALINA_OPTS} \
-Xms2048m \
-Xmx2048m \
...
"
r5.large.setenv.sh
r5.largeはメモリ16GBなので、以下のように8192MBをtomcatに割り当ててみました。
export CATALINA_OPTS="\
${CATALINA_OPTS} \
-Xms8192m \
-Xmx8192m \
...
"
S3にアップロード
以下のように、上記で作成したファイルをS3の任意のバケットに保存します。
setenv.shを置き換える
それでは、EC2のユーザーデータなどの起動時スクリプトに以下を記述しておきます。
S3からsetenv.shをダウンロード
S3から用意したインスタンスタイプのsetenv.shを全部落としてきます。IAMロールなどのパーミッションをセットするのを忘れずに。配置場所はtomcatディレクトリのbinフォルダの中です。
$ aws s3 sync s3://your-bucket/middleware/tomcat/setenv/ /path-to-tomcat/bin/
インスタンスタイプに合わせて置き換える
以下のコマンドで自身のインスタンスタイプを取得して、{インスタンスタイプ}.setenv.shをsetenv.shに置き換えます(コピーします)。
$ ec2-metadata -t | cut -d":" -f2 | xargs echo | xargs -I{} ls {}.setenv.sh | xargs -I{} cp {} setenv.sh
以上になります。
このやり方なら、インスタンスタイプに合わせて自由にsetenv.shを用意することができ、利用するインスタンスタイプが増えたとしてもS3上のファイルを増やせば対応できますので、ソースコードの修正は不要になります。
setenv.shたちをGit管理しておくのもおすすめです。
オートスケーリングで複数のインスタンスタイプを利用しながら、スケールアウトしていく場合などに利用する想定で作成しました。
以上ご参考になればと。