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