AWS fargateでkotlin(java)アプリをデプロイする方法


ポイント

  • fargateのタスク定義の「タスクメモリ」で指定したメモリ量を超えた場合、タスクは強制終了されます。
  • 従って、タスクメモリを超えないように最大ヒープサイズ等を調整する必要があります。

環境

  • 言語: Kotlin
  • フレームワーク: ktor
  • dockerイメージ: openjdk:8-jre-alpine

Dockerfile

FROM openjdk:8-jre-alpine

ENV APPLICATION_USER ktor
RUN adduser -D -g '' $APPLICATION_USER

RUN mkdir /app
RUN chown -R $APPLICATION_USER /app

USER $APPLICATION_USER

COPY ./build/libs/my-application.jar /app/my-application.jar
WORKDIR /app

CMD ["java", "-server", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-XX:InitialRAMFraction=2", "-XX:MinRAMFraction=2", "-XX:MaxRAMFraction=2", "-XX:+UseG1GC", "-XX:MaxGCPauseMillis=100", "-XX:+UseStringDeduplication", "-XX:MaxMetaspaceSize=256M", "-XshowSettings:vm", "-jar", "my-application.jar"]

基本的にはktorのドキュメントを元にしていますが、以下のjavaのオプションを追加しました。

  • -XX:MaxMetaspaceSize=256M : メタスペースの最大値を256MB確保して、それ以上増やさない設定です。 デフォルトでは無制限に拡張できてしまうので、念のため最大値を設定しました。
  • -XshowSettings:vm : 起動時にVMの設定を出力します。

fargateのタスク定義

コンテナの定義で、メモリのハード制限を必ず指定してください。
ここで指定した値が、 docker run--memoryオプションに渡されます。
通常は、タスクメモリと同じ値を指定してください。

タスクのログの確認

Fargateのタスクのログを表示し、Max. Heap Sizeが想定した値になっていることを確認してください。
今回の場合は、ハード制限が1000MiBで、javaのオプションが "-XX:MaxRAMFraction=2" なので、500Mとなるのが正しいです。

参考