AWS ECSサービスをGithub Actionsで自動的に開始および終了する
AWS ECSでデプロイしたPlog(「開発者のためのブログ制作プロジェクト」)を終了するにあたり、サーバーメンテナンスの費用を可変的にコントロールしたいと思いました。
(勉強目的で始めたものであり、お金を稼ぐために維持しているサービスではないので… 節約しないといけないですね…)
ECSの費用は大したものではありませんが、それでも無駄に維持する必要はないと考えました。ただ、チームメンバーがいつでも転職や就職時にポートフォリオとして活用できるように、APIサーバーを上げたり下げたりすることを企画しようと思います。
ECSサービスの終了はどうするのか?
実は非常に簡単です。ECSサービスの希望するタスク数を0に設定すればよいのです。逆に開始する場合は、希望するタスク数を希望するコンテナ数に設定すればよいのです。
注意すべき点は、この方法が決してデプロイする方法を意味するわけではないということです。すでに生成されたコンテナを終了し、再起動することを意味します。
AWS CLI
以前はAWS CLIのコマンドを自動化して使用しようとしていました。方法もわかっていましたが、結局はGithub Actionを利用することにしました。 理由は次の通りです。
- フロントチームメンバーはAWSにあまり慣れていませんでした。
- AWSクライアントのコマンドを使用するにはAWSアクセスキーとシークレットキーを使用する必要がありますが、これらをチームメンバー間で共有して使用することはあまり優雅に見えませんでした。
手順
- AWSアクセスキーIDとAWSシークレットアクセスキーをチームメンバー間で共有した後、AWS CLIをインストールします。
- AWS Configureを介して、アクセスキーとシークレットキーを入力して設定を完了させます。
$ aws configure > AWS Access Key ID [None]: {AWS_ACCESS_KEY_ID} > AWS Secret Access Key [None]: {AWS_SECRET_ACCESS_KEY} > Default region name [None]: {AWS_REGION} > Default output format [None]: {AWS_OUTPUT_FORMAT}
- AWSクライアントを介してECSサービスを開始および終了します。
$ aws ecs update-service --cluster plog-cluster --service plog-service --desired-count 0 # サービス終了 $ aws ecs update-service --cluster plog-cluster --service plog-service --desired-count 希望のタスク数 # サービス開始
Github Actions
Github ActionsはGithubが提供するCI/CDサービスです。Githubが提供するさまざまなアクションを通じてCI/CDを構成することができます。
強力な利点の一つはGithub Secretsで、Githubが提供する秘密キー管理システムです。Github Actionsを通じてデプロイするとき、Github Secretsに保存された秘密キーを使用することができます。
この機能を通じて前述のAWSアクセスキーとシークレットキーを直接入力せず、Github Secretsを介して登録し、Github Actionsで活用することができました。
手順
Github SecretsにAWSアクセスキーとシークレットキーを登録します。 a. Githubリポジトリ > 設定 > Secrets > New repository secretで
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
を登録します。筆者はECSデプロイ時にECRアドレスがAWS_ACCOUNT_ID
を含んでいるため、AWS_ACCOUNT_ID
を追加で登録しました。ECSサービス開始ワークフローファイル
project-root/.github/workflows/start-ecs.yaml
を作成します。name: Start ECS Service on: workflow_dispatch: env: ECS_CLUSTER: 作成したECSクラスター名 ECS_SERVICE: 作成したECSサービス名 jobs: start-plog: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Start ECS Service run: | aws ecs update-service --cluster ${% raw %}{{ env.ECS_CLUSTER }}{% endraw %} --service ${% raw %}{{ env.ECS_SERVICE }}{% endraw %} --desired-count 1 env: AWS_ACCESS_KEY_ID: ${% raw %}{{ secrets.AWS_ACCESS_KEY_ID }}{% endraw %} AWS_SECRET_ACCESS_KEY: ${% raw %}{{ secrets.AWS_SECRET_ACCESS_KEY }}{% endraw %} AWS_DEFAULT_REGION: "AWSリージョン"
ECSサービス終了ワークフローファイル
project-root/.github/workflows/stop-ecs.yaml
を作成します。name: Stop ECS Service on: workflow_dispatch: env: ECS_CLUSTER: 作成したECSクラスター名 ECS_SERVICE: 作成したECSサービス名 jobs: stop-plog: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Stop ECS Service run: | aws ecs update-service --cluster ${% raw %}{{ env.ECS_CLUSTER }}{% endraw %} --service ${% raw %}{{ env.ECS_SERVICE }}{% endraw %} --desired-count 0 env: AWS_ACCESS_KEY_ID: ${% raw %}{{ secrets.AWS_ACCESS_KEY_ID }}{% endraw %} AWS_SECRET_ACCESS_KEY: ${% raw %}{{ secrets.AWS_SECRET_ACCESS_KEY }}{% endraw %} AWS_DEFAULT_REGION: "AWSリージョン"
どちらのアクションもdesired-count
を除けば同じです。desired-count
は希望するタスク数を意味します。0
に設定するとサービスが終了し、1
に設定するとサービスが開始されます。
下の写真で1つ必要な部分が変更されると考えればよいでしょう。ECSは指定したタスク数に応じてコンテナ数を調整します。
各yaml
ファイルでon
をworkflow_dispatch
に設定した理由はGithub Actionsを手動で実行するためです。
name
は適切に設定すればアクションリストで見やすくなります。
Summary
Github Actionを通じてECSサービスを開始および終了する方法を知ることができました。Github Actionsを通じてAWS ECSをデプロイする方法は後日扱う予定です。