MFA必須の環境下でAmazon EKSでkubectlを使う方法

MFA必須の環境下のEKSでkubectlを実行するための方法です。

結論としては、kubectlは内部的にAWS CLIを打っているので、AWS CLIのMFA設定の手順と同じとなります。

まず ~/.aws/credentials に自身のIAMユーザを登録します。

[base_cred]
aws_access_key_id = AKI....
aws_secret_access_key = xxxxxxx

次に ~/.aws/config に以下のように先程登録したcredentialを参照したMFAの設定を入れます。

今回は my-eks-admin-role というIAMロールを system:masters にマッピングしてありますので、こちらにスイッチしてkubectlを実行します。

[profile mfa]
output=json
region=ap-northeast-1
role_arn=arn:aws:iam::123456789012:role/my-eks-admin-role
source_profile=base_cred
mfa_serial = arn:aws:iam::123456789012:mfa/my_mfa

まずはAWS CLIでトークンが取れること確認しておきます。MFAのCODEが聞かれます。

$ aws eks get-token --profile mfa --cluster-name my-cluster
Enter MFA code for arn:aws:iam::123456789012:mfa/my_mfa:
# -> {"status": {"expirationTimestamp": "2020-11-03T07:51:39Z", "token": "k8s-aws-v1.....

後はいつも通り、 update-kubeconfig でkubectlを更新すればOKです。

aws eks update-kubeconfig --profile mfa --name yo-cluster --region ap-northeast-1

普通にMFA必須環境下でも実行できてます。

$ kubectl get apiservices
NAME                                   SERVICE   AVAILABLE   AGE
v1.                                    Local     True        22h
v1.admissionregistration.k8s.io        Local     True        22h
# 省略

一応、確認のためMFAの期限切れた後も実行できること確認します。

以下でAWS CLIのキャッシュを削除します。

$ rm -fR ~/.aws/cli

もう一回 kubectl を実行してみます。内部でAWS CLIが呼ばれるので、MFAのコード聞かれます。MFAが機能してます。

$ kubectl get apiservices
Enter MFA code for arn:aws:iam::123456789012:mfa/my_mfa:
NAME                                   SERVICE   AVAILABLE   AGE
v1.                                    Local     True        22h
v1.admissionregistration.k8s.io        Local     True        22h
# 省略