LoginSignup
1
0

boto3でAWS Batchジョブ定義の最新リビジョンを取得するときにハマった

Last updated at Posted at 2024-01-13

はじめに

Lambda経由でBatchを実行しようとしたら古いリビジョンのジョブ定義が呼ばれてしまった。
困ったのは同条件でも最新リビジョンが取れてしまうことがあったという点。
同じコードを実行しているのに挙動が変わるので、原因がコードにあるのか、それとも他にあるのか、という段階から当たりをつけていくことになり、迷走しました。

目次

  1. 原因
  2. コード
  3. 解決方法
  4. 最大100件の制限を忘れない

原因

原因はコードにありました。

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等)
実装する際は注意しようと思う。

1
0
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
1
0