はじめに
Lambda経由でBatchを実行しようとしたら古いリビジョンのジョブ定義が呼ばれてしまった。
困ったのは同条件でも最新リビジョンが取れてしまうことがあったという点。
同じコードを実行しているのに挙動が変わるので、原因がコードにあるのか、それとも他にあるのか、という段階から当たりをつけていくことになり、迷走しました。
目次
原因
原因はコードにありました。
client.describe_job_definitions()
このdescribe_job_definitions()は
アカウントの同一リージョンに存在するすべてのジョブ定義から最大 100 件のジョブ定義のみを取得するメソッドでした。
一方アカウントに存在するジョブは200件を超えていました。
同じコードでも最新リビジョンが取れてしまうことがあったのは最大100件の中に対象のジョブ定義が含まれていたからでした。
コード
def get_newest_revision():
job_definition_name = 'qiita'
client = boto3.client("batch")
job_definitions = client.describe_job_definitions()['jobDefinitions']
revision_n = 1
for job in job_definitions:
if job["jobDefinitionName"] == job_definition_name:
if job["revision"] > revision_num:
revision_n = job["revision"]
return revision_n
解決方法
get_newest_revision()
を使わないで、ジョブの実行を行う。
現在、submit_job()
はデフォルトで最新リビジョンを参照するようになっています。
一応jobDefinition=definition-name:revision
として古いリビジョンを指定することもできるようです。
client.submit_job(
jobName=job_name,
jobQueue=job_queue,
jobDefinition=job_definition
)
最大100件の制限を忘れない
describe_job_definitions()
に限らず、boto3のメソッドには一回のリクエストで取得できるオブジェクトの数が制限されるメソッドが多く存在します。(S3のlist_objects_v2
等)
実装する際は注意しようと思う。