GitHub Actions で EKS を触る
GitHub Actions で EKS を触ることのできる kubectl
をセットアップします。
kubectl
だけほしい
「github actions kubectl」などのワードで検索すると、「Azure がどうのこうの」「個人が作った Docker な GitHub Actions」といったページがヒットします。もちろん後者が悪いわけではないのですが、kubectl
がほしいだけなのに、Docker イメージになっているのはちょっとオーバースペックです。かといって、自分でアクションを作るのは手間ですし、「見つけ切れていないだけでなんかあるんじゃないか」と不安になります。
というわけで、azure/setup-kubectl
アクションを使います。「あれ?Azure じゃん」と思われがちですが、このアクションは正真正銘の「kubectl
をセットアップするだけのアクション」です。
- 手軽
- 余計なものが入らない
- 認証済みプロバイダによる公開 (Microsoft)
といったメリットが挙げられます。
使い方
README に記載されているままですが、アクションに
- uses: azure/setup-kubectl@v1
を追加するだけです。これでこのステップ以降にて kubectl
が使えるようになりました。
EKS との連携
ただし、もちろんこのままでは EKS に接続ができません。EKS に接続できる kubeconfig (.kube/config
) を食わせる必要があります。
最近の aws-cli
で EKS の設定を行った (aws eks update-kubeconfig
) 場合、kubeconfig の users
はだいたい下記のようになっているはずです。
- name: arn:aws:eks:ap-northeast-1:XXXXX:cluster/XXX
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- ap-northeast-1
- eks
- get-token
- --cluster-name
- XXX
command: aws
一昔前のやり方だと aws-iam-authenticator
を使う (command: aws-iam-authenticator
になっている) ようになっているので、その場合は aws-cli
をアップデートして再度 update-kubeconfig
するか、GitHub Actions 上で aws-iam-authenticator
をセットアップする必要があります。
この kubeconfig を GitHub リポジトリの Secrets に登録します。名前は KUBE_CONFIG_DATA
としておきます (なんでもいいです)。kubeconfig はテキストファイルですが、ファイルをそのまま Secrets に置くという意味では base64 エンコードするべきですので、
cat .kube/config | base64 --encode
この結果を Secrets の値として入れておきます。
さて、この kubeconfig は aws
コマンド (aws-cli
) を必要とします。これを使うためのアクションは AWS 公式に用意されています。
- uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
これで aws configure
が完了した状態で aws
コマンドが使用できます。
そして、リポジトリ Secrets の AWS_ACCESS_KEY_ID
と AWS_SECRET_ACCESS_KEY
に、EKS にアクセスできる IAM ユーザーを入れておきます。
kubectl
が Secrets 内の kubeconfig を使えるようにファイルに書き出し、ファイルパスを環境変数 KUBECONFIG
にて設定します。そうすると EKS に接続できる kubectl
が使えるようになります。
- env:
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}
run: |
echo "$KUBE_CONFIG_DATA" | base64 --decode > /tmp/kube_config
export KUBECONFIG=/tmp/kube_config
kubectl get pods
うまくいっていればポッドの一覧が出力されます。
もちろん、実際に運用するときは、CI 専用の IAM ユーザー/ロールを作り、対応する Kubernetes RBAC を割り当てる必要があります。
完成形
最小限のワークフローはこんな感じになります。
name: CI
on:
- push
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Install kubectl
uses: azure/setup-kubectl@v1
- name: Run kubectl
env:
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}
run: |
echo "$KUBE_CONFIG_DATA" | base64 --decode > /tmp/kube_config
export KUBECONFIG=/tmp/kube_config
kubectl get pods
Discussion