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 # 省略