8
7

More than 3 years have passed since last update.

python,motoでAWS-Batchをmockできたので残しておく

Last updated at Posted at 2019-12-18

はじめに

AWS-Batchをmotoを使用してmockし、ジョブを登録するところまでできたので備忘録として残しておく。

mock対象リソース

  • IAM Role
  • AWS-Batch コンピューティング環境
  • AWS-Batch ジョブキュー
  • AWS-Batch ジョブ定義

コード

test_aws_batch.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
import boto3
from moto import mock_batch, mock_iam


class MyTestCase(unittest.TestCase):
    @mock_iam
    @mock_batch
    def test_aws_batch(self):
        client = boto3.client('batch')
        iam = boto3.client('iam')

        # iam roleをmock
        iams = iam.create_role(
            RoleName='test_matsu_iam',
            AssumeRolePolicyDocument='string',

        )
        iam_arn = iams.get('Role').get('Arn')
        print("iamRoleArn: " + iam_arn)

        # aws-batch コンピューティング環境をmock
        batch = client.create_compute_environment(
            computeEnvironmentName='test_matsu_batch',
            type='UNMANAGED',
            serviceRole=iam_arn
        )
        compute_environment_arn = batch.get('computeEnvironmentArn')
        print("computeEnvironmentArn: " + compute_environment_arn)

        # aws-batch ジョブキューをmock
        job_qs = client.create_job_queue(
            jobQueueName='test_matsu_job_q',
            state='ENABLED',
            priority=1,
            computeEnvironmentOrder=[
                {
                    'order': 1,
                    'computeEnvironment': compute_environment_arn
                },
            ]
        )
        job_q_arn = job_qs.get('jobQueueArn')
        print("jobQueueArn: " + job_q_arn)

        # aws-batch ジョブ定義をmock
        job_definition = client.register_job_definition(
            jobDefinitionName='test_matsu_job_definition',
            type='container',
            containerProperties={
                'image': 'string',
                'vcpus': 123,
                'memory': 123
            },
        )
        job_definition_arn = job_definition.get('jobDefinitionArn')
        print("jobDefinitionArn: " + job_definition_arn)

        # ジョブを追加
        client.submit_job(
            jobName='string',
            jobQueue=job_q_arn,
            jobDefinition=job_definition_arn
        )

        # ジョブ一覧を取得
        jobs = client.list_jobs(
            jobQueue=job_q_arn
        )

        # ジョブ一覧を出力
        print("jobSummaryList: " + str(jobs.get('jobSummaryList')))


if __name__ == '__main__':
    unittest.main()

実行結果

$ python -m unittest test.test_aws_batch -v
test_aws_batch (test.test_aws_batch.MyTestCase) ... iamRoleArn: arn:aws:iam::123456789012:role/test_matsu_iam
computeEnvironmentArn: arn:aws:batch:ap-northeast-1:123456789012:compute-environment/test_matsu_batch
jobQueueArn: arn:aws:batch:ap-northeast-1:123456789012:job-queue/test_matsu_job_q
jobDefinitionArn: arn:aws:batch:ap-northeast-1:123456789012:job-definition/test_matsu_job_definition:1
jobSummaryList: [{'jobId': 'ee3a3206-fdfe-404f-a1c1-9c444b41b546', 'jobName': 'string'}]
ok

----------------------------------------------------------------------
Ran 1 test in 0.167s

OK

各種リソースがモックされ、ジョブを投入することに成功。

終わりに

このmockでAWSの実リソースを使わずにAWS-Batchにジョブを投入するテストが可能になった。
ただ残念なのは、投入したジョブの内容がjobId,jobNameしかないこと。
ジョブの作成時間やステータスに関連するテストには利用できそうにない。
投入したジョブを使用するテストにはunittestmockを使用するのが良さそうというのが結論。

8
7
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
8
7