リモート開発メインのソフトウェア開発企業のエンジニアブログです

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はサポートしています。

AWS Lambdaの設定画面で環境変数を指定

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

CloudWatch Logsの当該Lambdaのログ

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

← 前の投稿

Vagrant環境でRailsのリモートデバッグ(ブレークポイント使用可能)

次の投稿 →

AWS CLI のプロファイル切り替え関連

コメントを残す