🌟

Github actions + ecspressoで起動停止運用をしようって話

2025/02/17に公開

初めに

初めまして!
皆様どうもこんばんわ、こんにちわ、おはようございます。
エンジニアの榎本です。

最近よく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のサンプルコード

deploy.yml
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 上での変更履歴管理が容易
  • 運用フローがシンプル

「日中だけステージング環境を動かしたい」「夜間は全て停止したい」というシーンでぜひ試してみてください。
わずかな設定で大きくコストを削減できる可能性がありますので、ぜひ活用してみてください。

DELTAテックブログ

Discussion