【実務経験4ヶ月】自動で平日にEC2を開始させて休日・祝日に開始させない方法【AWS】【Step Functions】

そもそもこの仕組みの目的はというと、、

## 毎日のバッチ処理を休日・祝日はさせたくない
企業ってだいたい土日・祝日って休みじゃないですか。
休業日にサーバーが起動していたらもったいない、不要な処理は止めておきたい、、、そんなニーズってあると思うんですよね。

平日は普段通りインスタンスを開始させたい、
でも休日、祝日には停止させておきたい、そんな仕組み。

なので今回の記事は、、、

・サーバーの自動管理ができるようにしたい、
・コスト削減、労力の削減がしたい、
・エンジニアが他の業務に集中したい、

こんな方が対象です。

## 参考にした記事リンク

https://qiita.com/willco21/items/d73c3d99d01d4ecb798e

https://dev.classmethod.jp/articles/linking-aws-step-functions-and-aws-systems-manager-change-calendar-to-handle-irregularities-in-periodic-execution-processes/#toc-8

先輩エンジニアの方、企業の方、いつもありがとうございます。学ばせてもらっています、、、

## 使用したAWSサービス

EventBridge
SSM automation
Step Functions

この３つです。

主なフローはこの順番でやっていきます。

①SSM automationのChenge Calendarでイベント日時を設定
②Step Functionsで指定したイベントで動作するように設定
③EventBridgeで２つの仕組みを連携

それでは早速、解説してみます。

## ①SSM automationのChenge Calendarでイベント日時を設定

まずはSSM automationでカレンダーの設定です。

「カレンダーの変更」からイベントの作成、イベントの開始日時を設定します。

ご存知の方もいらっしゃると思いますが基本的にUTCといって世界標準時間を基準にしています。

日本時間はUTCの+9時間なので、例えば、AM10:00に設定したいならAM1:00に設定します。今回はAM7:40に設定したいので、９時間前の22:40に設定します。

![スクリーンショット 2022-08-25 7.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/3d4f3099-33b0-55d8-13b4-bc898fc679e9.png)

そうするとこの画面が表示されます。
![スクリーンショット 2022-08-25 7.37.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/17bdc59f-8f5d-54d0-4188-e3bd743dcb4b.png)

その次にカレンダーでDEFALT_CLOSEDにするのかDEFALT_OPENにするのかを設定します。

![スクリーンショット 2022-08-25 7.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/d9fe5aec-a081-7046-ac61-467e2e6524be.png)


今回は祝日の場合は、処理をさせたくないのでDEFALT_OPENに設定しておきます。設定の詳細はStepfunctionで設定するときに説明します。

設定したカレンダーの名前は、後にStep Functions、EventBridgeでも使用するのでarnを控えておきます。説明タブのCalendar useに記載されています。
![スクリーンショット 2022-08-26 7.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/fc92cf22-82c9-8763-0dba-193127782492.png)

## ②Step Functionsで指定したイベントが動作するように設定

Step Functionsの設定はワークフローとJSONの記述を用いながら説明したかったのですがなぜか私のコンソール画面でワークフローが表示されませんでした。

ちなみにJSONの記述についてはぜひクラスメソッドさんの記事を読んでみてください。先ほど控えたCalendarNamesはステートマシンの記述に使用します。

ザックリと成功したステートマシンのワークフローを見ながら説明したいと思います。

![スクリーンショット 2022-08-26 8.21.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/bb3c0c41-1587-5970-b891-4671a0b7451f.png)

実際の流れはこんな感じです。
まず最初にGetCalendarStateAPIを呼び出して祝日のイベントを設定したカレンダーの情報を参照します。

その次にChoiceを使ってカレンダーのその日がOPENなのかCLOSEなのか判定し、その状態によって次に動作するフローを決めます。

CLOSEDならPass、OPENなら、WaitになりSuccesに遷移するといった順番になります。このSuccesに何かしらのアクションを入れれば実用できます。

## あれ？ちょっと待ってください・・・
ちょっと戻って先ほどの結果の画像見てもらいたいステップ出力を見てもらいたいのですがstateがCLOSEDになっています。

![スクリーンショット 2022-08-26 8.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/60f9cb57-62ac-2183-7562-65da17490359.png)


あれ？先ほどのカレンダー設定ではデフォルトで開く＝OPENと設定したはずです。
なのになぜCLOSEDになっているのでしょうか？

参考にしているクラスメソッドさんの記事だとこう書かれています。

DEFALT_CLOSED＝指定した日にイベントを起こしたい
DEFALT_OPEN＝指定した日にイベントを起こさない

これ、お店で例えるとわかりやすい。

DEFALT_CLOSED
デフォルトでクローズだからいつもは営業していません！指定した日はオープンです！なので指定した日だけ営業しています。

たまにデパートとかで地方物産展とかやるじゃないですか。沖縄物産展とか北海道物産展とか。あれと同じです。

DEFALT_OPEN
オープンはその逆。いつも営業しています！指定した日はクローズなので閉店しています。

だからOPENでカレンダーを設定してStep Functionsを動作させて成功。出力結果はCLOSEDとなるんです。

記事を最後まで読んでみると書いてあります笑、なぜOPENで設定したのに出力結果がCLOSEDと出るんだろう・・今考えてみると当たり前なんですけど地頭が悪さが出ましたね・・笑

ここまででStep Functionsの設定が終わりました。実際のJSONの記述内容についてはぜひクラスメソッドさんの記事を読んでみてください！

## EventBridgeで日時を設定する

ではカレンダーとステップファンクションの設定が終わったところでEventBridgeでの平日にいつもの時間で開始させる設定を行います。

こちらの設定は至って簡単です。スケジュール設定で日時を指定します。

![スクリーンショット 2022-08-27 14.40.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/bead2565-3a27-d6c0-a214-2fdc51bd15f8.png)

CRON式の時間設定は少々むずかしいのですが、とりあえず毎日決まった時間にイベントを動かしたいなら画像にある通りに入れれば大丈夫です。（後付けで撮った写真なので日時は前後しているのでご了承を。）


その次にターゲットタイプ。Step Functions ステートマシンを選択しステートマシンの名前を選びます。

![スクリーンショット 2022-08-27 14.50.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/d10b09cb-9877-3b92-3b66-948e89892e60.png)

指定した時間になったらステートマシンを動作させることができます。

EventBridgeを毎日9時設定しておいて、カレンダーでは休日と祝日にイベントを入れておく。そうすると毎日に９時にカレンダーのオープンかクローズが判定されてオープンならEC2が開始、クローズならそのままPassで開始させずに済むようになります。

とりあえずこんなところでしょうか。
経験者の方に読まれるとエグいツッコミが待っていそうですが。お手柔らかにお願いします。