Github actions + ecspressoで起動停止運用をしようって話
初めに
初めまして!
皆様どうもこんばんわ、こんにちわ、おはようございます。
エンジニアの榎本です。
最近よくgithub actionsをよく触る機会があり、効率化のために色々と試行錯誤しています。
本記事では、そうした経験から得たTipsを共有します。(2回目)
1回目の記事はこちら
AWS のコスト削減は常に話題に上がりますが、その代表的な方法の一つが 必要なときだけリソースを起動し、不要なときは停止する という運用(起動停止運用)です。
特に Staging 環境などは、深夜や休日などに無駄にリソースを稼働させる必要はなく、業務時間だけ起動しておけば十分というケースも多いはずです。
今回は、ECS で動くアプリケーションを ecspresso と GitHub Actions を使って起動/停止する仕組みの例をご紹介します。
ユースケース
この記事で役立つ・参考になるのは、以下のようなケースです
- ECS でアプリケーションを運用しており、ecspresso をデプロイツールとして使っている
- ステージング環境などでコスト削減のために「平日の日中だけ起動し、夜間や週末は停止したい」と考えている
- AWS のサービス(EventBridge Scheduler など)を使うよりも、GitHub Actions で一元管理したい
Event Bridge Schedulerでいいのでは?
もちろん EventBridge Scheduler を使ってスケジュールを組むのも一般的です。
ただ、IAM ポリシーの設定やSchedulerの設定(Cron、API の選択など)を行う必要があり、個人的には少しだけ手間に感じています。。
一方、GitHub Actions であれば、CI 用のファイル(Workflow)を 1 つ書くだけで済むので、わかりやすいという利点があります。
もちろん AWS リソースに対して操作を行うので それ用のIAM ロールは必要ですが、ファイルの管理が GitHub 上にまとまるのはシンプルで便利です。
github actionsのサンプルコード
name: ECS Task STOP For Staging
on:
workflow_dispatch:
schedule:
- cron: "0 10 * * *" # 19:00 JST に停止
jobs:
task_control:
name: Stop ECS Containers with ecspresso
runs-on: ubuntu-latest
strategy:
matrix:
service: [api, worker]
permissions:
contents: read
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-1
role-to-assume: xxxx #ここにAssumeするRole ARNを設定
- name: ecspresso install
uses: kayac/ecspresso@v2
with:
version: latest
- name: ecspresso scale with task 0 for ${{ matrix.service }} service
run: ecspresso scale --config ${{ matrix.service }}.ecspresso.yml --tasks=0
ポイント解説
メインの部分を解説を書いていきます。
...
strategy:
matrix:
service: [api, worker]
...
...
- name: ecspresso install
uses: kayac/ecspresso@v2
with:
version: latest
- name: ecspresso scale with task 0 for ${{ matrix.service }} service
run: ecspresso scale --config ${{ matrix.service }}.ecspresso.yml --tasks=0
-
strategy.matrix
service: [api, worker] のように複数のサービスを配列で指定することで、同じジョブを複数サービスに対してまとめて実行できます。 -
ecspresso scale --tasks=0
ecspresso には scale コマンドがあり、タスク数を動的に変更できます。ここでは--tasks=0
とすることでコンテナを停止しています。
このようにecspressoには便利なコマンドがいくつかあり、コマンドリファレンスもあったりします。
眺めてみると、他にも新たな使い道が思い浮かぶかも? -
Workflow の管理
GitHub Actions 上で設定ファイルを一元管理できるので、設定の変更履歴や PR ベースでの変更がわかりやすいのもメリットです。
起動の場合はこのymlファイルのCron表記とtask数を変更するのみでOKです。
ちょっとした努力で最大限の成果を出そう
いかがでしたか?
ECS を運用するうえでコストを削減したい場合、必要なときだけコンテナを起動し、不要なときは停止する というシンプルな運用が非常に効果的です。
EventBridge Scheduler やその他の方法もありますが、GitHub Actions と ecspresso を組み合わせることで、設定を一つのファイルでコードベースで管理できる点は大きなメリットです。
- 管理がコードで一元化
- GitHub 上での変更履歴管理が容易
- 運用フローがシンプル
「日中だけステージング環境を動かしたい」「夜間は全て停止したい」というシーンでぜひ試してみてください。
わずかな設定で大きくコストを削減できる可能性がありますので、ぜひ活用してみてください。
Discussion