シングルサインオンユーザーの変更、または aws-auth ConfigMap の削除または破損が原因で、Amazon Elastic Kubernetes Service (Amazon EKS) にアクセスできません。
簡単な説明
EKS クラスターにアクセスできなくなった場合、kubectl コマンドを実行すると、次のようなエラーが表示されます。
「エラー: サーバーへのログインが必要です (認証失敗)」
クラスターへのアクセスを回復するには、アクセスエントリを使用して AWS Identity and Access Management (IAM) プリンシパルのアクセス許可を管理します。これは Amazon EKS クラスターの外部から行います。
注: EKS クラスターの作成者が存在する場合は、EKS クラスター作成者の IAM プリンシパルを引き受け、ログインしてクラスターにアクセスします。デフォルトでは、EKS クラスターの作成者はクラスターの管理者です。以下のプロセスでは、クラスター作成者の元の IAM ロールと共存する管理者ロールを作成します。
解決策
前提条件
- kubectl をインストールします。
- 最新バージョンの AWS コマンドラインインターフェイス (AWS CLI) をインストールして設定します。
- 次のアクセス許可を持つ IAM ロールが必要です。 CreateAccessEntry、ListAccessEntries、DescribeAccessEntry、DeleteAccessEntry、UpdateAccessEntry
**注:**AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
AWS EKS アクセスエントリ API を使用して Amazon EKS クラスターアクセスを管理する
注: 次のコマンドでは、以下を置き換えます。
<ACCOUNT_ID> は、EKS クラスターのあるソースアカウントのアカウント ID に置き換えます。
<REGION> は、お使いの AWS リージョンの名前に置き換えます。
<CLUSTER_NAME> は、お使いの EKS クラスターの名前に置き換えます。
<IAM_PRINCIPAL_ARN> は、管理者アクセス許可を持たせるロールの ARN に置き換えます。
AWS EKS アクセスエントリ API を使用して Amazon EKS クラスターアクセスを管理するには、次の手順を実行します。
-
kubectl がインストールされているホストマシンで、以下のアクセス許可を持つ IAM ロールを引き受けます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:ListAccessEntries",
"eks:CreateAccessEntry",
"eks:DescribeCluster",
"eks:UpdateClusterConfig"
],
"Resource": [
"arn:aws:eks:<REGION>:<ACCOUNT_ID>:cluster/<CLUSTER_NAME>"
]
},
{
"Effect": "Allow",
"Action": [
"eks:DeleteAccessEntry",
"eks:ListAssociatedAccessPolicies",
"eks:DisassociateAccessPolicy",
"eks:AssociateAccessPolicy",
"eks:UpdateAccessEntry",
"eks:DescribeAccessEntry"
],
"Resource": [
"arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<CLUSTER_NAME>/*"
]
}
]
}
-
ID を確認するには、以下のコマンドを実行します。
aws sts get-caller-identity
コマンドの出力で得た ARN を書き留めます。次のような形式となります。arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin
-
次のコマンドを実行して Amazon EKS クラスターの現在の認証モードを確認します。
aws eks describe-cluster --name <CLUSTER_NAME> --query 'cluster.accessConfig.authenticationMode' --region <REGION>
Amazon EKS クラスターの現在の認証モードが API_AND_CONFIG_MAP の場合、既にクラスターでは必要なアクセスモードを使用しています。ステップ 5 までスキップします。
-
次のコマンドを実行して Amazon EKS クラスターの認証モードを更新します。
aws eks update-cluster-config --name <CLUSTER_NAME> --access-config authenticationMode=API_AND_CONFIG_MAP --region <REGION>
注: CONFIG_MAP 認証モードから API モードに切り替えることはできますが、API モードから CONFIG_MAP モードに戻すことはできません。
-
次のコマンドを実行して、クラスターと IAM ロールのアクセスエントリを作成します。
aws eks create-access-entry --cluster-name <CLUSTER_NAME> --principal-arn <IAM_PRINCIPAL_ARN> --region <REGION>
出力は次のようになります。
{
"accessEntry": {
"clusterName": "<CLUSTER_NAME>",
"principalArn": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
"kubernetesGroups": [],
"accessEntryArn": "arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<CLUSTER_NAME>/user/<ACCOUNT_ID>/new-cluster-admin/26c6d1f8-4211-3fe0-f9d2-734b912dcd9a",
"createdAt": "2024-02-13T19:27:45.370000+00:00",
"modifiedAt": "2024-02-13T19:27:45.370000+00:00",
"tags": {},
"username": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
"type": "STANDARD"
}
}
-
次のコマンドを実行して、AmazonEKSClusterAdminPolicy を Amazon EKS クラスターと IAM ロールに関連付けます。
aws eks associate-access-policy --cluster-name <CLUSTER_NAME> \
--principal-arn <IAM_PRINCIPAL_ARN> \
--policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
--access-scope type=cluster \
--region <REGION>
出力は次のようになります。
{
"accessEntry": {
"clusterName": "<CLUSTER_NAME>",
"principalArn": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
"kubernetesGroups": [],
"accessEntryArn": "arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<cluster_name>/user/<ACCOUNT_ID>/new-cluster-admin/7ec6efb3-31c8-edcf-3039-ca2b38e0d708",
"createdAt": "2024-02-25T08:34:06.002000+00:00",
"modifiedAt": "2024-02-25T08:34:06.002000+00:00",
"tags": {},
"username": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
"type": "STANDARD"
}
}
-
kubeconfig ファイルを更新または生成するには、次のコマンドを実行して EKS クラスターに接続します。
aws eks update-kubeconfig --name <CLUSTER_NAME> --region <REGION>
-
次のコマンドを実行して、ユーザーが管理者として EKS クラスターにアクセスできることを確認します。
kubectl auth can-i '*' '*' --all-namespaces
**注:**管理者として EKS クラスターにアクセスできる場合、出力には yes と表示されます。
関連情報
簡素化された Amazon EKS アクセス管理コントロールの詳細
Amazon EKS API サーバーに接続したときに「You must be logged in to the server (Unauthorized)」(サーバーにログインする必要があります (未承認)) というエラーを解決する方法を教えてください
EKS アクセスエントリ (eksctl のウェブサイト)