この記事の対象
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)です。
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
を利用して安易にコンテナイメージを生成しているため、こういった方法を取りました。