GitHub Actions から EKS の job を実行する
この記事はポート株式会社 サービス開発部 Advent Calendar 2024の18日目の記事です。
はじめに
こんにちは。ポート株式会社でSREチームのマネージャーをしているTaiki130です。
業務で Kubernetes(EKS)上でのジョブ実行を簡単に行える仕組みを開発者に提供するため、GitHub Actions を利用して Workflow を作成しました。この方法を使えば、開発者がジョブ実行の複雑さを意識することなく、シンプルかつ安全に利用できる環境を提供できます。本記事ではその内容を紹介します。
kube-jobについて
単にジョブを実行するだけであれば、Jobのマニフェストをkubectl applyで適用すれば十分です。しかし、以下の要件を満たしたいと考えました。
- 同期的に実行:ジョブの完了を待ちたい
- 失敗時のWorkflow停止:ジョブが失敗した場合、GitHub Actions全体を失敗とする
- ログの標準出力:ジョブの実行ログを即座に確認可能にしたい
これらをシンプルに実現するために、kube-job
というCLIツールを選定しました。
事前準備
EKSのJobなので、Job実行用のIAM RoleとRBACの設定が必要になります。
※サンプルコードはそのままでは動きません。
IAM Role
今回は、 IAM Roles for Service Accounts(IRSA)を利用して、Jobを実行する権限をIAM Roleに付与します。
IRSAは、KubernetesのPodがAWSリソースに安全にアクセスするための仕組みです。Podが使うServiceAccountとIAMロールを関連付けることで、必要最小限の権限だけを付与できます。
詳細についてはこちらをご参照ください。
以下はTerraformを使用した設定例です。
Service Account, RBAC
次に、IAM Roleと紐づけるJob実行用のKubernetesのService AccountとRoleを作成します。実行に必要な権限はREADMEに書かれています。
workflow
GitHub ActionsのWorkflowは以下のステップで構成されています。
-
ECRにイメージが存在するか確認
aws ecr describe-images
を使用して、指定されたDockerイメージの存在をチェックします。 -
kube-jobをインストール
wgetなどを使用してkube-job
をインストールします。 -
ジョブを実行
実行するコマンドを渡して、kube-job
を用いてジョブを実行します。
workflow_dispatchで手動実行できるようにしており、GitHub Actionsのジョブ実行時に、kube-job
で実行するコマンドを渡します。
まとめ
今回ご紹介した仕組みは、AWS環境でのジョブ実行を効率的かつ安全に管理する方法です。例えば、kube-job
はAWS以外でも使用できるため、Google CloudやAzureのKubernetes環境、さらにはオンプレミスのKubernetesクラスタにも応用可能です。
参考にしていただけると幸いです。最後までお読みいただき、ありがとうございました!
明日のアドベントカレンダーは initiate さんの記事です!お楽しみに!
Discussion