はじめに
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
しかないこと。
ジョブの作成時間やステータスに関連するテストには利用できそうにない。
投入したジョブを使用するテストにはunittest
のmock
を使用するのが良さそうというのが結論。