Batch — Boto3 Docs 1.21.3 documentation
のドキュメントを頼りに、以下のような 1つの Job が動いて成功したら次の Job を実行する
Lambdaを Pythonで書く。
lambda_function.py のソースコード
import logging import boto3 logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info('# boto3 vertion: {0}'.format(boto3.__version__)); client = boto3.client('batch', region_name='ap-northeast-1') JobAsubmit = client.submit_job( jobName = 'JOB-A', jobQueue = 'job-queue', jobDefinition = 'JOB-A:1', containerOverrides={ 'command': ['java', '-jar', 'ajob.jar' ] } ) JobBsubmit = client.submit_job( jobName = 'JOB-B', jobQueue = 'job-queue', dependsOn=[ { 'jobId': JobAsubmit['jobId'] }, ], jobDefinition = 'JOB-B:1', containerOverrides={ 'command': ['java', '-jar', 'bjob.jar' ] } ) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
JOB-A, JOB-B の実行状況を参照しようとする。
によると、describe_jobs(**kwargs) を使用するのだが、
引数に与えるのは、Job定義ではなく、発行したJobId である。
しかも、100個までしか指定できない。
だから、describe_jobs 呼び出しは以下のようにする。
describeResonse = client.describe_jobs(jobs=[ JobAsubmit['jobId'], JobBsubmit['jobId'] ]) # 参照できた jobName と status を、'jobName:status’の書式にしてリスト化する。 list = [ "{jobName}:{status}".format(**job) for job in describeResonse['jobs'] ]
このままでは、describe_jobs 実行に対して、AccessDenied が発生する
https://aws.amazon.com/jp/premiumsupport/knowledge-center/troubleshoot-iam-policy-issues/
と案内あるが、
すぐに解決に辿り着けない。非常に解りにくい。
結局、手っ取り早く、実行する Lambda に インラインポリシーを作成して以下を付与して解決
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "batch:DescribeJobs" ], "Resource": "*" } ] }