長時間化不可避な自動テストをCloudFormationでCloudWatch Eventによるスケジュール実行にしてみた

自動テストの長時間化が避けられない対応処置としてCloudWatch Eventでのスケジュール指定を検討してみました。
2019.11.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

1回辺り数時間かかるものの、実行は時間指定での1日1回で十分だと想定されるケースに対処するため、自動テストのスケジュール設定をCloudWatch Eventにて試してみました。属人性を無くすためにCFnのテンプレート化も併せて行っています。尚、以下の記事をベースにしています。

GitHub連携を含んだCodeBuildのCloudFormationテンプレート生成を試してみた

CloudWatch EventをCFnで指定する

CloudFormationでのType指定はAWS::Events::Ruleになります。AWS::CloudWatch::Alarmではありません。今回は毎日9:00AMからの実施としてみました。

  TestSchedule:
    Type: 'AWS::Events::Rule'
    Properties:
      Description: Boot staging unit-test
      ScheduleExpression: 'cron(0 9 * * ? *)'
      Targets:
        - RoleArn: !GetAtt BuildRole.Arn
          Arn: !GetAtt Build.Arn
          Id: TestBuild

AWS::Events::Rule - AWS CloudFormation

公式ドキュメント上で解説されている設定可能な項目は他のリソースと変わらず多めですが、実際の動作で必須となるのは動作対象リソースのARN等一部です。

また、イベント毎の動作を解除するため、元の記事のテンプレートのAWS::CodeBuild::ProjectリソースからTriggersの指定を外しておきます。

気をつけるべき点としてScheduleExpressionの曜日指定があります。

ScheduleExpressionの曜日指定

ドキュメントにも記載されていますが、特定曜日を指定しない場合には「*」(アスタリスク)ではなく「?」(クエスチョン)を用います。

The * (asterisk) wildcard includes all values in the field. In the Hours field, * would include every hour. You cannot use * in both the Day-of-month and Day-of-week fields. If you use it in one, you must use ? in the other.

> cron(Minutes, Hours, Day-of-month, Month, Day-of-week, Year)
cron(* * * * ? *)

Schedule Expressions for Rules - Amazon CloudWatch Events

あとがき

自動テスト処理時間の長期化は運用上避け難いポイントです。リポジトリへのPushやPull-Requestを起点に実施している場合、完了時間の長期化が開発速度に影響してくるため、テスト内容に応じて実施頻度を変更する等の対応が必要になります。

EC2インスタンス上でテスト実施をcron指定する方法もありますが、EC2インスタンスそのものの管理から開放される点で、可能であればCloudWatch Eventでのスケジュール指定もオススメです。