AWS EKSのコンソールで表示される権限エラーへの対応


最近、ちょっとした検証環境として使っていたGKEからAWS EKSへ乗り換えることになりました。
クラスタを起動してマネジメントコンソールから状況を参照しようとしたところ次のようなエラーが表示されたので対応します。エラーメッセージに詳細へのリンクがありますが、具体的な対応方法を得るのに時間がかかったため記事にしました。

EKSは経験不足のため、もし他に対応方法などありましたらコメント頂けると幸いです

症状

EKSのコンソールでクラスタを選択すると、次のエラーが出てクラスタの内容を表示できない。

現在のユーザーまたはロールには、この EKS クラスター上の Kubernetes オブジェクトへのアクセス権がありません
これは現在のユーザーまたはロールがクラスターリソースを記述するための Kubernetes RBAC アクセス許可を持っていないか、クラスターの認証設定マップにエントリがないことが原因である可能性があります。詳細はこちら

原因

書いてある通りですが、コンソールにログインしているユーザにクラスタ情報にアクセスするための権限が無い事が原因です。

作業の概要

(この文章で作業できれば以降は読む必要がありません)

KubernetesのconfigMapを利用して、対象クラスタにコンソールユーザからのアクセス許可を付与します。
次のページを参考にしました。

Amazon EKS でクラスターを作成した後、他の IAM ユーザーおよびロールにアクセス権を付与するにはどうすればよいですか?

準備

下準備1、コンソールユーザのARNを確認する

configmap作成時に必要になります。
マネジメントコンソールのユーザメニューから表示できます。
次のようなやつです。

arn:aws:iam::<アカウントNo>:user/< Iamユーザ名>

下準備2、クラスタ用ロールのARNを確認する

対象のクラスタに設定されているIAMロールのARNを確認します。
マネジメントコンソールを使う方法と、AWS CLIを使う方法があります。

方法1(マネジメントコンソールで確認)

コンソールでEC2サービスを開き、でクラスタ用として自動起動しているインスタンスを選択して詳細を開くと「インスタンス概要」の部分にIAMロール名が表示されています。

このIAMロール名をアカウントNoと組み合わせると目的のARNになります。

例:

arn:aws:iam::<アカウントNo>:role/< IAMロール名>

方法2(CLIで確認)

あるいは、次のコマンドで確認できます。

> eksctl get iamidentitymapping --region ap-northeast-1 --cluster <クラスター名>

ARN                                                                                             USERNAME                                GROUPS
arn:aws:iam::455999999999:role/eksctl-eks-cluster-nodegroup-NodeInstanceRole-XXXXXXXX           system:node:{{EC2PrivateDNSName}}       system:bootstrappers,system:nodes

処理

上記の情報をもとに権限の付与を実施します。

コンフィグマップの雛形を取得

クラスタロール設定用のコンフィグマップのひな形をダウンロードします。

curl -o aws-auth-cm.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml

コンフィグマップを編集

次の<ARN of instance role (not instance profile)>の部分をクラスタ用ロール名のARNに置き換えます。

data:
  mapRoles: |
    - rolearn: <ARN of instance role (not instance profile)>

上記mapRolesと同じ深さで次に示すmapUsersの項目を追加します。

  mapUsers: |
    - userarn: <ユーザARN>
      username: <ユーザ名>
      groups:
        - system:masters

完成形は次のようになります。

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: <ロールARN>
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
  mapUsers: |
    - userarn: <ユーザARN>
      username: <ユーザ名>
      groups:
        - system:masters

作成したコンフィグマップを適用する

> kubectl apply -f aws-auth-cm.yaml

Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply configmap/aws-auth configured

ワーニングが出ますが設定自体は出来ています。
(気になる方はこちらなど参考になりそうです)

設定の確認は次のコマンドで行います。

kubectl describe configmap -n kube-system aws-auth

設定内容が表示されます。

確認

EKSのコンソールでクラスタを選択し、詳細などが表示されれば成功です。