
JAVA_TOOL_OPTIONS環境変数でAWS Lambda関数のシステムプロパティを設定する
最近AWS Lambdaをよく使う事があり、色々知見が溜まってきました。
今回はAWS Lambdaに直接関係がないトピックですが、JavaアプリケーションをLambdaで動かす時にシステムプロパティの値を変更したくなり、調べた結果 JAVA_TOOL_OPTIONS
環境変数で設定が可能と言う事を知ったのでメモしておきます。

本来はJavaの-Dオプションでアプリ実行時にシステムプロパティを指定できる
Javaアプリケーションは java
プロセス立ち上げ時に、 -D
オプションを使う事で、コードを変更する事無くシステムプロパティを設定する事ができます。
例えば、とあるScalaプロジェクトでSimpleLogger (slf4jの実装) を使っているのですが、このロガーの出力レベルはシステムプロパティ org.slf4j.simpleLogger.defaultLogLevel
で制御が可能です。
※余談ですがgrizzled.slf4jのLoggerトレイトが便利でおすすめです。こいつをミックスインしたクラスでは簡単にロギングが行なえます。
object MyApp extends scala.App with grizzled.slf4j.Logging {
debug("Debug message!")
info("Info message!")
}
SimpleLoggerのデフォルトのレベルはINFOなので、上記アプリケーションの出力内容は以下となります:
$ java -jar target/scala-2.13/my_app.jar # このプロジェクトではsbt-assemblyでjar化してる
[main] INFO MyApp - Info message!
INFO MyApp – Info message!
では -D
オプションで org.slf4j.simpleLogger.defaultLogLevel
に DEBUG
を実行時に指定してみます。アプリケーションコードの変更およびリコンパイルはしていません:
$ java -Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG -jar target/scala-2.13/my_app.jar
[main] DEBUG MyApp - Debug message!
[main] INFO MyApp - Info message!
Debugメッセージが出力されました。
しかしAWS Lambdaは起動時オプションを指定できない
なので先程の手は使えません。しかし、ググってみるとすぐにJAVA_TOOL_OPTIONSに辿り着きます。
これは、Javaの起動オプションを環境変数経由で設定する物で、システムプロパティ (-D) 以外にも使えます。
セキュリティ上の理由から、この環境変数が使えない事もあるみたいですが、AWS Lambdaはサポートしています。

このように設定し、起動すると無事表示する事ができました!

デバッグしたい時だけ有効にする事もできますし、アプリの再デプロイも不要なので大変便利ですね!
コメントを残す