0
1

More than 3 years have passed since last update.

AWS BatchでJavaのコンテナをLambda経由で起動する時にシステム環境変数を渡す

Last updated at Posted at 2021-02-28

この記事の対象

Spring Boot
EC2コンテナ
AWS Batch
AWS Lambda (node.js 14)

概要

Spring Bootで作成したバッチアプリケーションをAWS Batchに登録。
ジョブをLambda関数経由で呼び出す際にコンテナ起動パラメータを渡す方法です。

なんでそんなことを?

Batch用に作成したJavaコードに、共通処理が多いため、複数のジョブ起動が実装されており、システムプロパティ(@ConditionalOnPropertyアノテーション)を利用して、実行時に起動するジョブを選択できるようにしました。

その際に、Lambda関数側でJavaのシステムプロパティを渡す方法です。

詳細

サンプルはAWS Lambda(node.js 14)です。

sample.js
const AWS = require('aws-sdk');

module.exports = async function (param) {
    var batch = new AWS.Batch({
        httpOptions: {
            timeout: 1200000
        }
    });

    try {
        const result = await batch.submitJob({
            jobName: AWSバッチのジョブ定義名,
            jobDefinition: AWSバッチのARN,
            jobQueue: ジョブキューのARN,
            containerOverrides: {
                environment: [
                    // オーバーライドするJavaシステムプロパティを設定
                    {name: 'JAVA_OPTS', value: '-Dbatch.execute=ExecuteJob001 -Dfile.encoding=UTF-8'}
                ]
            }
        }).promise()
        console.log(result)
    } catch (err) {
        console.log("submitJob error: " + err)
        return { statusCode: 500 }
    }
};

肝は、containerOverridesパラメータです。
コンテナ起動時の環境変数をオーバーライドすることが出来ます。
このパラメータにJAVA_OPTS環境変数を定義する事で、起動するバッチアプリを選択できるようになります。

上記の例は、Javaコードで

@ConditionalOnProperty(value = {"batch.execute"}, havingValue = "ExecuteJob001")

と定義したアプリを起動する場合の引数指定方法になります。

最後に

他にも色々やり方はあるんですが、コンテナイメージを生成する際に

mvn spring-boot:build-image

を利用して安易にコンテナイメージを生成しているため、こういった方法を取りました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1