AWSLambdaとAWSBatchを本番環境と開発環境で分ける


AWS BatchのジョブをAWS Lambdaから実行する時に、本番環境とステージング環境を分けたい場合の構成を作ってみました。

AWSBatch

コンピューティング環境、ジョブキュー、ジョブ定義を環境別に分けます。

AWSLambda

AWSLambdaで環境別の実行環境を作るためにエイリアスを利用しました。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-aliases.html

Lambdaはエイリアス別に環境変数を定義することができません。(2021.07.03現在)
なので、環境別のAWSBatchの定義を自前で用意します。

config.ini
[dev]
JOB_QUEUE = arn:aws:batch:ap-northeast-1:xxxxxxxxx-dev
JOB_DEFINITION = arn:aws:batch:ap-northeast-1:xxxxxxxxx:job-definition/xxxx-dev:1

[stg]
JOB_QUEUE = arn:aws:batch:ap-northeast-1:xxxxxxxxx-stg
JOB_DEFINITION = arn:aws:batch:ap-northeast-1:xxxxxxxxx:job-definition/xxxx-stg:1

[prd]
JOB_QUEUE = arn:aws:batch:ap-northeast-1:xxxxxxxxx-prd
JOB_DEFINITION = arn:aws:batch:ap-northeast-1:xxxxxxxxx:job-definition/xxxx-prd:1

Lambda実行側ではconfig.iniを読み取ってジョブ定義を取得します。
どのエイリアスが使用されているかはcontext引数のinvoked_function_arnからわかります。

※Lambdaの記述例

lambda_function.py
import re
import configparser
import boto3


def lambda_handler(event, context):
    mo = re.search(
        r'func_name:(?P<alias>dev|stg|prd)',
        context.invoked_function_arn
    )

    config = configparser.ConfigParser()
    config.read('config.ini')
    JOB_QUEUE = config[mo.group('alias')]['JOB_QUEUE']
    JOB_DEFINITION = config[mo.group('alias')]['JOB_DEFINITION']
    JOB_NAME = 'xxxxxxxxx'

    client = boto3.client('batch')
    response = client.submit_job(
      jobName = JOB_NAME,
      jobQueue = JOB_QUEUE,
      jobDefinition = JOB_DEFINITION,
    )
    return {
      'statusCode': 200,
        'body': json.dumps('run')
    }

さいごに

AWSLambdaのエイリアス別に環境変数を定義できれば、わざわざconfig.iniを追加する必要ないのにと思いました。
もっと簡単な方法で環境別の構成が作っている方がいたら教えて下さい。

参考サイト