マイクロサービスではお馴染みのAWSのコンテナ向けサーバーレスコンピューティングエンジン「Fargate」。基本料金が高額な上、一般的に1つのサービスでもいくつも動かすため、他のAWS製品と比較しても、毎月かなり高額な請求がきます。実際のところ常に動かす必要があるわけではないはずです。本番環境は常時稼働させる必要があるかもしれませんが、dev環境や検証環境などは、使っていない時間はそれなりにあるはずです(夜間など)。弊社サービスのdev環境のFargateは、平日は10時に起動、夜の22時に停止。土日は常に停止という風に自動化しています。今回はこの自動化の方法について共有することで、「現在Fargateを使っているが、いかんせん節約したい」といった同業者の手助けになれば思い投稿しました。時間を任意に設定する。・必要な実行ロールを付与する。今回はGo言語で実装します。仕様は、「1つのクラスターにある複数のサービスを起動・停止する」ものとします。起動用のLambda関数が以下になります。aerr.Error())}return}fmt.Println(result)}}やっていることはとてもシンプルで、aws-sdk-goというパッケージを用いて、ECSの指定したクラスターとサービスを起動させています。細かく順番にみていきましょう。起動したいサービスたち(同クラスター上のものであることが条件)を列挙します。[]string{"sample-service1","sample-service2","sample-service3","sample-service4","sample-service5",}その後、指定した各サービスごとにfor文を回し、aws-sdk-goのUpdateServiceという機能で起動させていきます。ここで事前に、引数のUpdateServiceInputという型にサービス情報を入力しますが、今回は実行するインスタンス数を示すdesiredCountは定数で全て1に設定しています。svc.UpdateService(input)その後はパッケージのエラー処理。aerr.Error())}return}続いて停止用のLambda関数になります。いっても違いはdesiredCountと関数名くらいでやっていることは同じです。desiredCountを0にすることでタスクを完全に停止できます。aerr.Error())}return}fmt.Println(result)}}最後にこれらをzip化して、それぞれ「起動用」と「停止用」のLambdaにアップロードします。Eventsで起動時間と停止時間をcronで設定します。今回は、起動時間は平日の10時、停止時間は夜の22時に設定します。停止時間を毎日に設定しているのは、休日に緊急対応で使う人がもし停止し忘れても、夜の10時には停止するよう実行ロール設定トリガーとプログラムが実行できるような実行ロールを付与してあげます。Eventsに関するものを付与します。以下がポリシーのJSONです。]}あとはこれをそれぞれのLambda関数に実行ロールに付与すれば、自動化は完成です。結果こうした自動化の結果、平日に12時間稼働させるだけになったdev環境のFargateは、単純計算で約65%もの費用を削減できました。EC2よりも高額に見えるFargateですが、このように効率的に運用することにより、かえってコストパフォーマンスはよくなることもあります。この機会にどなたかの倹約に役立てれば幸いです。「評価の基準を変え、お金の流れを変え、フェアな世界をつくる。クリエイターへのお問合せnoteカイゼン目安箱クリエイターの。