GitHub ActionsをAWSのスポットインスタンスを使ってスケールラブルに運用する
最近、CI/CDプロセスをGitHub Self-Hosted Runnerを使ってインフラ面をもっとコントローラブルかつコスパよくする機会があったので本記事で紹介します。
ただし、ステップ・バイ・ステップな記事にするととんでもない長さになるので、以下の動画で実際の手順に関してはまとめました。
私自身は特に何も作り上げてはおらず、 GitHub Runners on AWS というものが公開されていたので、そこのサンプルをベースに実際に構築しただけになります。よって、英語が問題なく読める方は上のサイトを読み解けば構築することができます。ただし、若干わかりづらい点もあるので、その点も含めて動画では解説しています。
以下が今回作成するインフラの概要図です。( https://philips-labs.github.io/terraform-aws-github-runner/ より引用)
そしてもっと具体的なアーキテクチャが以下です。( https://philips-labs.github.io/terraform-aws-github-runner/ より引用)
Organizationに紐づくGitHub Runner(Organization内のリポジトリで共有する)の場合であれば、ざっくりとした流れは以下のようになります。
- リポジトリ内にインストールするGitHub AppがWorkflowイベントを受け取り、AWSのAPI GatewayにPostする
- API GatewayからScale Up用のLambdaにイベントが飛ぶ
- Scale Up Lambdaが必要に応じてSpot Instanceをリクエストする
- EC2が初期化され、GitHubのWorkflowを取得して実行する
- Workflowが完了したらGitHub Appに通知され、WorkflowのStatusが更新される
- (1-5が一連の実行の流れとなるが)Scale Down用のLambdaが定期的にSpot Instanceが立ち上がりつづける必要があるかどうか判断し、不要であれば削除する
1-6が繰り返される。
この一連のインフラがさくっと構築できるようにTerraformで提供してくれているのが GitHub Runners on AWS です。
必要な手順の概要
- GitHub Appの作成と設定: GitHub上で新しいGitHub Appを作成し、必要な権限を設定します。
- Terraformキットの使用: philips-labs/terraform-aws-github-runnerというオープンソースのTerraformキットを使用します。このキットは、スポットインスタンス上にセルフホステッドランナーを簡単にセットアップできるようになっています。
- AWSリソースのセットアップ: AWSで必要なサービスリンクロールを設定します。
- Terraformを使用したインフラのデプロイ: Terraformを使用して、GitHub Actions Runnerを含むインフラをデプロイします。
- リポジトリにGitHub Appをインストール: 該当リポジトリにGitHub Appをインストールし、Workflowイベントを受け取れるようにします。
1-5が完了すると、該当リポジトリ内でWorkflowを発火させる(e.g. コミットをpushする)と、うまくいけばSelf-Hosted RunnerでWorkflowが実行されます。
セットアッププロセスは複雑に思えるかもしれませんが、philips-labsから提供されているテンプレートとドキュメントに従えば、比較的簡単に実行できるようになっています。
上で紹介した動画では、実際にこのセットアップを行うデモを通じて、具体的な手順とトラブルシューティングの方法を紹介しています。
注意点
Self-Hosted Runnerを安全に運用するためには、セキュリティ面での注意が必要です。今回紹介している方法は主に自組織内かつprivateなリポジトリで限定的な人が使うことが自明な場合での手順となります。不特定多数の人が使う可能性がある場合は、追加でセキュリティ面で考慮すべき点が増えることは気にしておいてください。
おわりに
本記事では、GitHub ActionsをAWSのスポットインスタンス上で効率的に運用する方法に関する概要を紹介しました。細かい手順に関しては動画を見ていただけたらと思います。これからSelf-Hosted Runnerをコスパよく使いたいと思っている方の役に少しでも立てたら幸いです。
Discussion