はじめに
自分以外の人が作成したEKSのPodをAWSのマネジメントコンソールから確認しようとした際に以下のようなエラーが出てきて見れなかったことがありました。
現在の IAM プリンシパルは、このクラスター上の Kubernetes オブジェクトにアクセスできません。(英語:Your current IAM principal doesn’t have access to Kubernetes objects on this cluster.)
権限関連のエラーだと思ったので、自身のIAMユーザ(スイッチロールを利用している場合はIAMロール)の権限を確認したところEKS関連の権限は付与されており、試しにAdministratorAccess権限をつけても状態は変わりませんでした。また、公式のドキュメントや個人ブログなどいくつかトラブルシューティングに関する情報を漁り、解決できたものの、理解しづらかったり、CloudShellで対応しようとすると解決までに時間がかかってしまいました。
そこで、本記事では手順を簡潔にまとめます。
※本記事はあくまでもトラブルシューティングに関する内容に留めており、エラーに関連するKubernetesの設定やEKSの仕様についての記載は割愛します。
エラーの原因
そもそものエラー原因ですが、EKSはIAM以外に「aws-auth ConfigMap(S3のバケットポリシーのようなAWSのリソースベースのアクセス制御)」と「Kubernetesのロールベースのアクセス制御 (RBAC) 」によるアクセス制御の方法があります。デフォルトの設定でEKSを作成した場合、作成者以外の人にEKSのPodを閲覧できるようにするためには、IAM以外のこれら2つのアクセス制御の設定も修正する必要があるということになります。
エラーの解消手順
エラー原因を踏まえ、手順は大きく分けて以下の3つです。
1. IAMユーザ(ロール)にEKSの権限を付与する
2. Kubernetesのロールベースのアクセス制御 (RBAC) の権限設定を変更する
3. EKSの「aws-auth ConfigMap」の設定を変更する
※ 2と3の設定変更はEKSを作成したIAMユーザ(ロール)で実行する必要があります。
※ CloudShellで実施する場合は上記手順に加えて「CloudShellでの実行環境の構築手順」も必要となります。
1. IAMユーザ(ロール)にEKSの権限を付与する
私はEKSのAdministrator権限をすでに付与していたため、1の手順はスキップしていますが、ドキュメントには以下のIAMポリシーがついていれば良いと記載されています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:ListFargateProfiles", "eks:DescribeNodegroup", "eks:ListNodegroups", "eks:ListUpdates", "eks:AccessKubernetesApi", "eks:ListAddons", "eks:DescribeCluster", "eks:DescribeAddonVersions", "eks:ListClusters", "eks:ListIdentityProviderConfigs", "iam:ListRoles" ], "Resource": "*" }, { "Effect": "Allow", "Action": "ssm:GetParameter", "Resource": "arn:aws:ssm:*:<アカウントID>:parameter/*" } ] }
2. Kubernetesのロールベースのアクセス制御 (RBAC) の権限設定を変更する
以下のコマンドを実行し、EKSのコンソールに対するフルアクセス権を付与することができる設定ファイルをKubernetesに読み込ませます。
kubectl apply -f https://s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-full-access.yaml
ただし、上記のコマンドをEKSで実行しようとするとkubectlに関するエラーが出てきたため、事前に以下のコマンドを実行し、CloudShellでkubectlを実行するための環境を作った後にkubectl applyを実行します。
(ついでに3の手順でeksctlコマンドを使うのでeksctlもここでインストールしておきます)
mkdir -p $HOME/.local/bin cd $HOME/.local/bin curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.13/bin/linux/amd64/kubectl chmod +x kubectl aws eks update-kubeconfig --name <クラスター名> curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp sudo mv /tmp/eksctl $HOME/.local/bin
3. EKSの「aws-auth ConfigMap」の設定を変更する
変数部分を修正し、CloudShellで以下のコマンドを実行します。
eksctl create iamidentitymapping \ --cluster <クラスター名> \ --region=<リージョン> \ --arn arn:aws:iam::<対象のAWSアカウントID>:user/<ユーザ名> \ --group eks-console-dashboard-full-access-group \ --no-duplicate-arns
なお、2の手順を実施せずに3の手順だけを実施すると、EKSのコンソールからPodを閲覧しようとすると以下のようなエラーが出ます。
リソースのロード中にエラーが発生しました
pods is forbidden: User “” cannot list resource “pods” in API group “” at the cluster scope
※今回はEKSの作成者以外に対するコンソールからの閲覧のみ許可することを目的としているため、groupを「eks-console-dashboard-full-access-group」としていますが、groupを「system:masters」にすることで、セキュリティ面は考慮する必要がありますが、コンソールからの閲覧以上の権限を与えることも可能です。(また、groupを「system:masters」にすると2の手順を踏まなくてもPodが閲覧可能になります。)
おわりに
S3やKMSのようにもう少し権限周りがシンプルになればいいのにと思うものの、今回エラーに遭遇したおかげでEKSの仕様についての理解が深まったのでいい機会だったと思います。
ただ、今後クラウドネイティブ化/内製化が進んでいきEKSを利用する人や企業が増え、EKSの運用保守を後任や別のベンダーから引き継ごうとした際に今回のようなエラーに遭遇することも増えていくのではと思っています。
私自身、今までEKSを触れる機会がなかったため、EKSの権限周りの仕様が理解できておらず、解決に時間を要してしまったため、本記事が同様のエラーに遭遇した方の助けになれば幸いです。
参考
・IAM のトラブルシューティング
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/security_iam_troubleshoot.html
・AWS Management Console 内の Kubernetes リソースを表示する
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/view-kubernetes-resources.html
・re:Post Amazon EKS の「Your current user or role does not have access to Kubernetes objects on this EKS cluster」というエラーを解決する方法を教えてください。
https://repost.aws/ja/knowledge-center/eks-kubernetes-object-access-error
・Viewing Kubernetes Resources Using the EKS Console
https://developers.eksworkshop.com/docs/python/eks/view-kubernetes-resources/
・eksctlのインストール
https://eksctl.io/installation/