❄️

GitHub Actions から EKS の job を実行する

2024/12/18に公開

この記事はポート株式会社 サービス開発部 Advent Calendar 2024の18日目の記事です。

はじめに

こんにちは。ポート株式会社でSREチームのマネージャーをしているTaiki130です。

業務で Kubernetes(EKS)上でのジョブ実行を簡単に行える仕組みを開発者に提供するため、GitHub Actions を利用して Workflow を作成しました。この方法を使えば、開発者がジョブ実行の複雑さを意識することなく、シンプルかつ安全に利用できる環境を提供できます。本記事ではその内容を紹介します。

kube-jobについて

単にジョブを実行するだけであれば、Jobのマニフェストをkubectl applyで適用すれば十分です。しかし、以下の要件を満たしたいと考えました。

  • 同期的に実行:ジョブの完了を待ちたい
  • 失敗時のWorkflow停止:ジョブが失敗した場合、GitHub Actions全体を失敗とする
  • ログの標準出力:ジョブの実行ログを即座に確認可能にしたい

これらをシンプルに実現するために、kube-jobというCLIツールを選定しました。

https://github.com/h3poteto/kube-job

事前準備

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を使用した設定例です。

https://github.com/Taiki130/eks-kube-job-sample/blob/main/role/main.tf

Service Account, RBAC

次に、IAM Roleと紐づけるJob実行用のKubernetesのService AccountとRoleを作成します。実行に必要な権限はREADMEに書かれています。

https://github.com/Taiki130/eks-kube-job-sample/blob/main/manifest/rbac.yaml

workflow

GitHub ActionsのWorkflowは以下のステップで構成されています。

  1. ECRにイメージが存在するか確認
    aws ecr describe-imagesを使用して、指定されたDockerイメージの存在をチェックします。

  2. kube-jobをインストール
    wgetなどを使用してkube-jobをインストールします。

  3. ジョブを実行
    実行するコマンドを渡して、kube-jobを用いてジョブを実行します。

workflow_dispatchで手動実行できるようにしており、GitHub Actionsのジョブ実行時に、kube-jobで実行するコマンドを渡します。

https://github.com/Taiki130/eks-kube-job-sample/blob/main/workflow/eks-run-job.yaml

まとめ

今回ご紹介した仕組みは、AWS環境でのジョブ実行を効率的かつ安全に管理する方法です。例えば、kube-jobはAWS以外でも使用できるため、Google CloudやAzureのKubernetes環境、さらにはオンプレミスのKubernetesクラスタにも応用可能です。

参考にしていただけると幸いです。最後までお読みいただき、ありがとうございました!

明日のアドベントカレンダーは initiate さんの記事です!お楽しみに!

GitHubで編集を提案
ポート株式会社 エンジニアブログ

Discussion