簡単な説明
このエラーは、AWS Identity and Access Management (AWS IAM) のユーザーまたはロールで AWS マネジメントコンソールを使用するときに表示されることがあります。このエラーは、IAM ユーザーまたはロールに Kubernetes API へのアクセスに必要な RBAC (Kubernetes のウェブサイトからの) 権限がないことを示しています。AWS マネジメントコンソールで Kubernetes リソースを表示するには、AWS IAM ユーザーまたはロールを Amazon EKS クラスターの aws-auth ConfigMap にマップする必要があります。
Amazon EKS クラスターを作成すると、クラスターの RBAC 設定で system: masters 権限が IAM ユーザーまたはロールに自動的に付与されます。これにより、Amazon EKS コンソールから Kubernetes リソースを表示することができます。また、Kubernetes 内で aws-auth ConfigMap を編集し、追加の AWS ユーザーまたはロールにクラスターを操作する権限を付与することもできます。
2 つの異なる認証システムを使用しています。AWS マネジメントコンソールは IAM を使用します。EKS クラスターは Kubernetes RBAC システム (Kubernetes のウェブサイトにある) を使用しています。クラスターの aws-auth ConfigMap は IAM ID (ユーザーまたはロール) をクラスター RBAC アイデンティティに関連付けます。つまり、aws-auth ConfigMap は IAM アイデンティティを Kubernetes アイデンティティに関連付けるということです。
解決策
前提条件
始める前に、次の情報を収集してください。
管理者以外のユーザーまたはロール
クラスター管理者 IAM ユーザーまたはロールではないユーザーが、Amazon EKS コンソールでの表示が必要な場合は、次のステップを実行してください。
1. AWS マネジメントコンソールユーザーの IAM アイデンティティ Amazon リソースネーム (ARN) を取得します。
IAM ロールの場合は、次の ARN 形式を使用してください。
arn:aws:iam::111122223333:role/example
**重要:**次の形式は使用しないでください。
arn:aws:iam::111122223333:role/my-team/developers/example
2. ARN をクラスター管理者に知らせて、管理者に aws-auth ConfigMap にあなたの追加をリクエストしてください。
注: ARN にアクセスする手順については、「AWS マネジメントコンソールユーザーの IAM アイデンティティ ARN を特定する」セクションを参照してください。
**クラスター作成者またはクラスター管理者のユーザーまたはロール **
クラスター作成者またはクラスター管理者は、kubectl ツールまたは eksctl ツールで aws-auth ConfigMap を管理してください。
注: デフォルトでは、system: master グループは cluster-admin という名前の clusterrole にバインドされています。この clusterrole は、ポリシールールでリソースと動詞にワイルドカード (「*」) を使用します。つまり、system: masters グループに割り当てられたすべてのユーザーは、クラスター内のすべての Kubernetes リソースにフルアクセスできます。
クラスター作成者とクラスター管理者が管理ステータスを確認する方法の詳細な手順については、「クラスター作成者の識別」セクションを参照してください。
AWS マネジメントコンソールユーザーの IAM アイデンティティ ARN を特定する
コンソールへのアクセスに使用している IAM ユーザーまたはロールを特定します。これは、AWS コマンドラインインターフェイス (AWS CLI) で使用する ID とは異なる場合があります。特定された IAM ユーザーまたはロールに、AWS マネジメントコンソールですべてのクラスターのノードとワークロードを表示する権限があることを確認します。次に、IAM アイデンティティの ARN を取得します。ARN にアクセスするには、次のいずれかのオプションを使用します。
AWS CLI を使用する
IAM ユーザーまたはロールに AWS CLI でアクセスできる場合は、次のコマンドを実行します。
aws sts get-caller-identity --query Arn
CloudShell を起動
AWS CLI でアクセスできない場合は、次のコマンドを実行します。
aws sts get-caller-identity --query Arn
出力は次のようになります。
"arn:aws:iam::111122223333:role/testrole"
\ - または -
"arn:aws:iam::111122223333:user/testuser"
注:
- IAM ロールの ARN の場合は、その形式が前提条件セクションで取得した ARN 形式と似ていることを確認してください。
- ARN に引き受けたロールが含まれている場合は、ロールの ARN を取得する必要があります。たとえば、引き受けたロール ARN、 arn:aws:sts::123456:assumed-role/MyRole/aadams は、ロール ARN、arn:aws:sts::123456:role/MyRole に関連付けられています。この値は IAM コンソールで確認できます。
クラスター作成者を特定する
クラスターを設定するための主要な権限を持つクラスター作成者または管理者ロールは、AWS CloudTrail で CreateCluster API 呼び出しを検索します。次に、API 呼び出しの UserIdentity セクションを確認します。
**ヒント:**CloudTrail でクラスター作成者名が見つかっても削除されている場合は、同じ名前の新しい IAM ユーザーまたはロールを作成します。この新しい IAM エンティティは、元のクラスター作成者と同じ ARN を持っているため、クラスターへの同じ管理者アクセス権を継承します。
注: CloudTrail には 90 日間の履歴しかありません。
kubectl または eksctl を使用して、新しい IAM ユーザーまたはロールを Kubernetes RBAC に追加する
kubectl または eksctl ツールを選択して aws-auth ConfigMap を編集する前に、必ず手順 1 を完了してください。次に、手順 2〜4 に従って、kubectl で編集します。eksctl で編集するには、手順 5 に進みます。
1. クラスターの作成者または管理者を特定したら、クラスター作成者の IAM を使用するように AWS CLI を設定します。詳細については、「設定の基本」を参照してください。
AWS CLI が IAM エンティティで正しく設定されていることを確認するには、次のコマンドを実行します。
$ aws sts get-caller-identity
出力で IAM ユーザーまたはロールの ARN が返ります。例:
{
"UserId": "XXXXXXXXXXXXXXXXXXXXX",
"Account": "XXXXXXXXXXXX",
"Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}
**注:**CLI コマンドの実行中にエラーが発生した場合は、使用しているのが AWS CLI の最新バージョンであることを確認してください。
2. kubectl で aws-auth ConfigMap を変更するには、クラスターへのアクセス権限が必要です。次の kubectl コマンドを実行します:
$ kubectl edit configmap aws-auth -n kube-system
コンソールには現在の ConfigMap が表示されます。
クラスターに接続できない場合は、kubeconfig ファイルを更新してみてください。クラスターにアクセスできる IAM ID を使用してファイルを実行します。クラスターを作成した ID には、常にクラスターへのアクセス権限があります。
aws eks update-kubeconfig --region region_code --name my_cluster
注:region\ _code を EKS クラスターの AWS リージョンコードに置き換え、 my\ _cluster を EKS クラスター名に置き換えてください。
kubectl コマンドは EKS サーバーエンドポイントに接続する必要があります。API サーバーエンドポイントがパブリックの場合は、エンドポイントに接続するにはインターネットアクセスが必要です。API サーバーエンドポイントがプライベートの場合は、EKS クラスターが実行されている VPC 内から EKS サーバーエンドポイントに接続する必要があります。
3. クラスター作成者または管理者としてテキストエディタで aws-auth ConfigMap を編集するには、次のコマンドを実行します。
$ kubectl edit configmap aws-auth -n kube-system
4. IAM ユーザーまたはロールを追加します。
mapUsers: |
- userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
username: testuser
groups:
- system:bootstrappers
- system:nodes
\ - または -
IAM ロールを MapRole に追加します。例:
mapRoles: |
- rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
username: testrole
groups:
- system:bootstrappers
- system:nodes
次の情報を入力します:
- system:masters では、スーパーユーザーは任意のリソースに任意のアクションを実行できます。これは実稼働環境のベストプラクティスではありません。
- 付与された権限を最小限に抑えることがベストプラクティスです。特定の名前空間にのみアクセスできるロールを作成することを検討してください。詳細については、Kubernetes ウェブサイトの「Using RBAC authorization」を参照してください。また、Amazon EKS コンソールの制限付きアクセスの例については、「必要なアクセス許可」および「特定の名前空間の Kubernetes リソースを表示する」セクションを参照してください。
5. eksctl ツールでは、次のコマンドで aws-auth ConfigMap を更新できます。
eksctl create iamidentitymapping --cluster your_cluster_Name --region=your_region --arn YOUR_IAM_ARN <arn:aws:iam::123456:role testing=""> --group system:masters --username admin</arn:aws:iam::123456:role>
注: your_cluster_Name を EKS クラスター名に、your_region を EKS クラスターリージョンに、\ _IAM\ _ARN を IAM ロールまたは ARN に置き換えます。
Amazon EKS クラスターへのアクセス権限を確認する
1. Amazon EKS コンソールを開きます。
2. [Amazon EKS] セクションのナビゲーションペインで、[クラスター] を選択します。
3. クラスターを選択します。
4. [概要] タブと [ワークロード] タブにエラーがないか確認します。
特定の名前空間を設定した場合、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"
特定の名前空間ではエラーは表示されません。
エラーメッセージのトラブルシューティングを行うには、「[Compute] (コンピューティング) タブに [Nodes] (ノード) が表示されず、また [Resources] (リソース) タブにも何も表示されず、AWS Management Console でエラーが表示される」を参照してください。