GitHub ActionsからKubernetes(EKS)のJobを実行する
はじめに
GitHub ActionsからKubernetes(EKS)のJobを実行したいというケースがあったので、それについてまとめます。Jobの実行にはkube-job
を用います。
外部からEKSにアクセスする仕組み
クラスターを操作する権限をAWSユーザーやロールに付与するには、EKSの aws-auth
というConfigMapを編集する必要があります。 仕組みは以下のようになっており、Kubernetesの認証Webhookという機能が用いられているみたいです。つまり、認証はAWSのIAM
で行い、認可はKubernetesのRole Based Access Control(RBAC)
によって決まります。
Ref: https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/cluster-auth.html
IAM Roleの作成
GitHub ActionsにてAWS認証しなければならないのでOpenID Connect (OIDC)認証可能なIAM Roleを作成し、認可としてEKSクラスターへの参照権限
のポリシーをアタッチします
resource "aws_iam_openid_connect_provider" "github_actions" {
url = "https://token.actions.githubusercontent.com"
client_id_list = ["sts.amazonaws.com"]
thumbprint_list = ["6938fd4d98bab03faadb97b34396831e3780aea1"]
}
resource "aws_iam_role" "github_actions_oidc" {
name = "GitHubActionsOIDC"
# 信頼関係
assume_role_policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Principal" : {
"Federated" : aws_iam_openid_connect_provider.github_actions.arn
},
"Action" : "sts:AssumeRoleWithWebIdentity",
"Condition" : {
"StringEquals" : {
"token.actions.githubusercontent.com:aud" : "sts.amazonaws.com"
},
"StringLike" : {
"token.actions.githubusercontent.com:sub" : "repo:<my-user-id>/<my-repository>:*"
},
}
}
]
})
}
resource "aws_iam_policy" "github_actions_oidc" {
name = "github_actions_oidc"
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : "eks:DescribeCluster",
"Resource" : "*"
}
]
})
}
resource "aws_iam_role_policy_attachment" "github_actions_oidc" {
role = aws_iam_role.github_actions_oidc.name
policy_arn = aws_iam_policy.github_actions_oidc.arn
}
RBACの設定
ありがたいことに、kube-jobのREADME.mdに必要なロールが記述されていました。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: job-exec-role
namespace: default
rules:
- apiGroups: ["batch"]
resources: ["jobs", "jobs/status"]
verbs: ["create", "get", "delete"]
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "delete", "deletecollection"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: job-exec-group
# namespace「default」に対して許可する
namespace: default
subjects:
- kind: Group
name: job-exec-group
apiGroup: rbac.authorization.k8s.io
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: job-exec-role
aws-authの設定
EKSは以下のTerraform moduleで構築しており、aws-authの設定ができます。
module "eks" {
source = "terraform-aws-modules/eks/aws"
# -- 省略 --
manage_aws_auth_configmap = true
aws_auth_roles = [
{
rolearn = "arn:aws:iam::0123456789012:role/${aws_iam_role.github_actions_oidc.name}"
username = "github-actions-k8s-access"
groups = ["job-exec-group"]
},
]
JobのManifest
KubernetesでJobを実行するためのマニフェストを記述すればOKです。
apiVersion: batch/v1
kind: Job
metadata:
name: migration
namespace: default
spec:
backoffLimit: 0
template:
spec:
containers:
- name: migration
image: 0123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/migration:latest
command: ["bundle", "exec", "rails", "db:migrate"]
restartPolicy: Never
GitHub Actions workflow
aws eks update-kubeconfig --name eks
でkubeconfigファイルを生成し、次のJob実行に渡します。以上でGitHub ActionsでKubernetesのJobが実行できます。
# -- 省略 --
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ap-northeast-1
role-to-assume: arn:aws:iam::0123456789012:role/GitHubActionsOIDC
- name: Configure EKS
run: |
aws eks update-kubeconfig --name eks
- name: Run db migration
run: |
wget https://github.com/h3poteto/kube-job/releases/download/v0.6.2/kube-job_v0.6.2_linux_amd64.zip
unzip kube-job_0.2.0_linux_amd64.zip
./kube-job run --config=$HOME/.kube/config \
--template-file=job.yaml \
--container="migration"
まとめ
今回は、GitHub ActionsからKubernetes(EKS)のJobを実行しました。また、GitHub ActionsにはSelf-hosted Runnersといって自分自身が用意した環境でJobを実行することもできるので今後試してみたいなと思いました。
参考文献
その他
OIDC ID認証(EKS)もできるみたい
Discussion