Amazon EKS の「現在のユーザーまたはロールには、この EKS クラスターの Kubernetes オブジェクトへのアクセス権がありません」というエラーを解決するにはどうすればよいですか?
最終更新日: 2021 年 7 月 28 日
Amazon Elastic Kubernetes Service (Amazon EKS) で「現在のユーザーまたはロールには、この EKS クラスターの Kubernetes オブジェクトへのアクセス権がありません」というエラーが表示されます。
簡単な説明
このエラーは、AWS Identity and Access Management (IAM) ユーザーまたはロールで AWS マネジメントコンソールを使用する場合に表示されます。このエラーは、Amazon EKS クラスターの aws-auth ConfigMap にない IAM ユーザーまたはロールで特に発生します。
Amazon EKS クラスターを作成すると、クラスターの RBAC 設定で、IAM ユーザーまたはロールに system:masters 許可が自動的に付与されます。例えば、IAM ユーザーまたはロールは、クラスターを作成するフェデレーティッドユーザーである可能性があります。aws-auth ConfigMap の一部ではない IAM ユーザーまたはロールを使用して Amazon EKS コンソールにアクセスすると、Kubernetes ワークロードを表示できません。クラスターの概要の詳細も表示できません。
追加の AWS ユーザーまたはロールがクラスターとインタラクションできるようにするには、Kubernetes 内で aws-auth ConfigMap を編集する必要があります。
解決方法
注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新のバージョンの AWS CLI を使用していることを確認してください。
IAM ユーザーまたはロールのアクセス権限を設定する
1. クラスターを設定するためのプライマリアクセス権限を持つクラスター作成者または管理者ロールを検索するには、AWS CloudTrail で CreateCluster API 呼び出しを検索します。その後、API 呼び出しの userIdentity セクションを確認します。
注: CloudTrail は 90 日間の履歴のみを提供します。
2. アクセス権限を必要とする IAM ユーザーまたはロールを特定します。
3. 特定された IAM ユーザーまたはロールに、AWS マネジメントコンソールですべてのクラスターのノードとワークロードを表示するためのアクセス権限があることを確認します。
aws-auth ConfigMap を使用して、IAM ユーザーまたはロールを RBAC ロールおよびグループにマッピングする
$ aws sts get-caller-identity
この出力は、IAM ユーザーまたはロールの Amazon リソースネーム (ARN) を返します。例:
{
"UserId": "XXXXXXXXXXXXXXXXXXXXX",
"Account": "XXXXXXXXXXXX",
"Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}
2. ARN が、クラスターを設定するためのプライマリアクセス権を持つクラスターの作成者または管理者と一致することを確認します。ARN がクラスターの作成者または管理者と一致しない場合は、クラスターの作成者または管理者に連絡して aws-auth ConfigMap を更新します。
3. テキストエディタで aws-auth ConfigMap を編集するには、クラスターの作成者または管理者が次のコマンドを実行する必要があります。
$ kubectl edit configmap aws-auth -n kube-system
4. IAM ユーザーまたはロールを追加するには、以下のいずれかのステップを実行します。
IAM ユーザーを mapUsersに追加します。例:
mapUsers: |
- userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
username: testuser
groups:
- system:bootstrappers
- system:nodes
- または -
IAM ロールを mapRolesに追加します。以下はその例です。
mapRoles: |
- rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
username: testrole
groups:
- system:bootstrappers
- system:nodes
注: 任意のリソースに対して任意のアクションを実行するためにスーパーユーザーにアクセスを許可するには、system:bootstrappers と system:nodes の代わりに system:masters を追加します。詳細については、Kubernetes ウェブサイトの Default roles and role bindings をご参照ください。
5. Amazon EKS コンソールでエラーを確認します。例:
Error loading Namespaces
namespaces is forbidden: User "testuser" cannot list resource "namespaces" in API group "" at the cluster scope
前述のエラーが表示された場合は、クラスターロールとクラスターロールのバインディングまたはロールとロールのバインディングを作成するのセクションに進んでください。
クラスターロールとクラスターロールのバインディングまたはロールとロールのバインディングを作成する
ConfigMap で IAM アカウントまたはロールがマッピングされている Kubernetes ユーザーまたはグループは、ロールのバインディングのサブジェクトである必要があります。ユーザーまたはグループは、クラスターロールバインディングのサブジェクトにもなります。つまり、Kubernetes リソースを表示するための許可を持つ Kubernetes ロールまたはクラスターロールにバインドされているロールのバインディングまたはクラスターロールのバインディングです。ユーザーまたはグループに必要な許可がない場合は、「権限がありません: Kubernetes クラスターへのアクセス権があることを確認してください」というエラーが表示されることがあります。ロールとバインディングを作成するには、Kubernetes ウェブサイトの Using RBAC authorization をご参照ください。
すべての名前空間の Kubernetes リソースを表示するには、クラスターロールとクラスターロールのバインディングを作成する必要があることに留意してください。特定の名前空間の Kubernetes リソースを表示するには、その名前空間のロールとロールのバインディングを作成する必要があります。
クラスターロールとクラスターロールのバインディングを作成するには、次の手順に従います。
1. マニフェストファイルをダウンロードします。
https://s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-full-access.yaml
注: ダウンロードしたファイルのグループ名は、eks-console-dashboard-full-access-group です。これは、aws-auth ConfigMap で IAM ユーザーまたはロールをマッピングする必要があるグループです。詳細については、クラスターのユーザーまたは IAM ロールを管理するの「すべての名前空間の Kubernetes リソースを表示する」のセクションをご参照ください。
2. (オプション) ステップ 1 でダウンロードしたマニフェストファイルをクラスターに適用する前に、グループの名前を変更します。その後、IAM ユーザーまたはロールを ConfigMap でそのグループにマッピングします。以下はその例です。
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: eks-console-dashboard-full-access-clusterrole
rules:
- apiGroups:
- ""
resources:
- nodes
- namespaces
- pods
verbs:
- get
- list
- apiGroups:
- apps
resources:
- deployments
- daemonsets
- statefulsets
- replicasets
verbs:
- get
- list
- apiGroups:
- batch
resources:
- jobs
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: eks-console-dashboard-full-access-binding
subjects:
- kind: Group
name: eks-console-dashboard-full-access-group
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: eks-console-dashboard-full-access-clusterrole
apiGroup: rbac.authorization.k8s.io
3. マニフェストファイルをデプロイします。
$ kubectl apply -f eks-console-full-access.yaml
4. clusterrole および clusterrolebinding のオブジェクトの作成を確認します。
$ kubectl describe clusterrole.rbac.authorization.k8s.io/eks-console-dashboard-full-access-clusterrole
$ kubectl describe clusterrolebinding.rbac.authorization.k8s.io/eks-console-dashboard-full-access-binding
5. IAM エンティティの新しいグループである eks-console-dashboard-full-access-group で aws-auth ConfigMap を更新します。
$ kubectl edit configmap aws-auth -n kube-system
6. IAM ユーザーを mapUsersに追加します。例:
mapUsers: |
- userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
username: testuser
groups:
- system:bootstrappers
- system:nodes
- eks-console-dashboard-full-access-group
7. IAM ロールを mapRolesに追加します。例:
mapRoles: |
- rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
username: testrole
groups:
- system:bootstrappers
- system:nodes
- eks-console-dashboard-full-access-group
特定の名前空間の Kubernetes リソースを表示する
1. マニフェストファイルをダウンロードします。
https://s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-restricted-access.yaml
注: ファイル内のグループ名は、eks-console-dashboard-restricted-access-group です。これは、aws-auth ConfigMap で IAM ユーザーまたはロールをマッピングする必要があるグループです。詳細については、クラスターのユーザーまたは IAM ロールを管理するの「特定の名前空間の Kubernetes リソースを表示する」のセクションをご参照ください。
2. (オプション) クラスターに適用する前に、グループの名前を変更します。その後、IAM ユーザーまたはロールを ConfigMap でそのグループにマッピングします。以下はその例です。
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: eks-console-dashboard-restricted-access-clusterrole
rules:
- apiGroups:
- ""
resources:
- nodes
- namespaces
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: eks-console-dashboard-restricted-access-clusterrole-binding
subjects:
- kind: Group
name: eks-console-dashboard-restricted-access-group
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: eks-console-dashboard-restricted-access-clusterrole
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: eks-console-dashboard-restricted-access-role
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- apiGroups:
- apps
resources:
- deployments
- daemonsets
- statefulsets
- replicasets
verbs:
- get
- list
- apiGroups:
- batch
resources:
- jobs
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: eks-console-dashboard-restricted-access-role-binding
namespace: default
subjects:
- kind: Group
name: eks-console-dashboard-restricted-access-group
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: eks-console-dashboard-restricted-access-role
apiGroup: rbac.authorization.k8s.io
注: 前述のファイルの名前空間は default です。別の名前空間を指定するには、クラスターに適用する前にファイルを編集します。
3. マニフェストをデプロイします。
$ kubectl apply -f eks-console-restricted-access.yaml
4. clusterrole および clusterrolebinding のオブジェクトの作成を確認します。
$ kubectl describe clusterrole.rbac.authorization.k8s.io/eks-console-dashboard-restricted-access-clusterrole
$ kubectl describe clusterrolebinding.rbac.authorization.k8s.io/eks-console-dashboard-full-access-binding
$ kubectl describe role.rbac.authorization.k8s.io/eks-console-dashboard-restricted-access-role
$ kubectl describe rolebinding.rbac.authorization.k8s.io/eks-console-dashboard-restricted-access-role-binding
5. IAM エンティティの新しいグループである eks-console-dashboard-restricted-access-group で aws-auth ConfigMap を更新します。
$ kubectl edit configmap aws-auth -n kube-system
6. IAM ユーザーを mapUsersに追加します。例:
mapUsers: |
- userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
username: testuser
groups:
- system:bootstrappers
- system:nodes
- eks-console-dashboard-restricted-access-group
7. IAM ロールを mapRolesに追加します。例:
mapRoles: |
- rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
username: testrole
groups:
- system:bootstrappers
- system:nodes
- eks-console-dashboard-restricted-access-group
Amazon EKS クラスターへのアクセスを確認する
1. Amazon EKS コンソールを開きます。
2. Amazon EKS セクションのナビゲーションペインで、[Clusters] (クラスター) を選択します。
3. お客様のクラスターを選択します。
4. [Overview] (概要) タブと [Workloads] (ワークロード) タブにエラーがないかどうかを確認します。
特定の名前空間について設定した場合は、Amazon EKS コンソールで次のエラーメッセージが表示されます。
Error loading Deployments
deployments.apps is forbidden: User "xxxxxx" cannot list resource "deployments" in API group "apps" at the cluster scope or in the namespace "xxxxxxx"
エラーは、特定の名前空間については表示されません。
エラーメッセージのトラブルシューティングについては、ワークロードまたはノードを確認できず、AWS マネジメントコンソールでエラーが表示されるを参照してください。