【AWS】指定日時にCodePipelineを実行しデプロイする
指定した時間に実行するCloudWatch Events(Event Bridge)のルールを作成することで、CodePipelineを実行する方法を学んだので記録します。
CodePipelineには定期実行の機能がありませんが、CloudWatch Events(Event Bridge)のスケジュール機能を合わせることで、深夜帯の実行や定期実行ができるようになります。
CloudWatch Eventsとは
CloudWatch Eventsは、AWSのリソースの変更に関する情報をほぼリアルタイムで提供するサービスです。AWSのリソースの変更に関する情報を使って、簡単なルールを設定し、イベントを特定のターゲットにルーティングすることができます。例えば、EC2インスタンスが起動すると、CloudWatch Eventsはその情報を受信し、設定されたルールに基づいて、Lambda関数を呼び出す、SNSトピックにメッセージを送信するなどのアクションを実行することができます。
また、CloudWatch Eventsは、cronやrate式を使用して、特定の時間に自動化されたアクションをスケジュールすることもできます。例えば、毎日午前6時にEC2インスタンスを停止するルールを設定できます。このように、CloudWatch Eventsは、AWS環境での監視や自動化を簡単かつ迅速に行うことができます。
今回は、後者のスケジュール機能を用いてCloudWatch Eventsのルールを作成し、指定した日時にCodePipelineを実行します。
ルールの新規作成
AWSドキュメントにしたがって、下記の手順でルールを新規作成しました。
- ルールを作成
- ルール詳細を定義
- スケジュールを定義
- ターゲットを設定する
- レビュー
1.ルールを作成
CloudWatchを開き、左のメニューからイベント>ルールを選択します。
ルールを作成を押して次へ進みます。
2.ルール詳細を定義
名前:ルールの名前
説明:いつどのような処理が行われるのか
イベントタイプ:default
ルールタイプ:今回は定期実行ではないので、スケジュールを選択
「続行してルールを設定する」へ進みます。
3.スケジュールを定義
AWSドキュメントを参考に、処理を実行したい日時を指定します。
上の例では2023年5月30日3:00(曜日指定なし)で設定してみました。
※時間がUTCとなっているので日本での時刻は-9時間するようにしましょう。
4.ターゲットを設定する
ターゲットを選択:今回はCodePipelineを実行したいのでCodePipelineを選択します。
パイプラインARN: arn:aws:codepipeline:リージョン名:アカウントID:パイプライン名
実行ロール:今回は「新しいロールを作成」を選択しました。
5.レビュー
最後に1〜4の設定内容の確認画面が出るので、問題がなければそのままルールを作成します。
これでルールの作成は完了です。
(補足)CodePipelineの自動実行を停止する
CodePipelineが自動実行設定の場合、対象のコミットをpushした時点でCodePipelineの実行が走ってしまうので、CodePipelineの自動実行を停止する必要があります。
CodePipelineの自動実行を停止は下記の手順で行います。
- SourceActionのPollForSourceChangesをfalseに設定する
CodePipeline>確認したいCodePipeline>Sourceの枠内にあるインフォメーションマークで確認することができます。 - CodeCommitの変更を検知してCodePipelineを実行するEventBridgeルールを無効化する
CloudWatch>対象のルール>無効化によって無効化することができます。
(補足)複数コミットをデプロイしたい場合
複数コミットがあった場合においても、最新のコミットをデプロイする場合、問題はありません。例えば、以下A,B,Cの変更順でコミットを実行し、これらのコミットをCodeCommitリポジトリにpushしたとします。
C コミット <--- 最新のコミット
B コミット
A コミット
上記の際、CodePipelineではパイプラインに設定されたリポジトリのブランチの最新のコミットを取得するため、A,B,Cすべてのコミットを含みます。
しかし、上記のコミットのうちBコミット以下のみデプロイしたい場合にはCodeBuild単体でCodeCommitのソース取得、テスト、デプロイを実装する必要があります。
まとめ
今回はCloudWatch Events(Event Bridge)のルールを新規作成することで、指定した日時にCodePipelineを実行する方法を紹介しました。私自身AWSを触る機会があまりなかったのですが、CloudWatch Eventsを使えば、「なるべくユーザーが使っていない時間帯にデプロイしたい!」「分単位で設定をしたい」みたいな時に役に立っていいなと思いました。
また、今回は紹介しきれませんでしたが、CloudWatch Eventsを使えば「毎週〇時に××を実行する」「5分に1回△△を実行する」などといった定期実行も可能になるので、機会があれば使っていけたらと思います。
参考文献
- CloudWatch Events
- ルールの新規作成
Discussion