Amazon EKS API サーバーに接続するときに、許可されていないサーバーエラーを解決するにはどうすればよいですか。
最終更新日: 2022 年 6 月 23 日
kubectl コマンドを使用して Amazon Elastic Kubernetes Service (Amazon EKS) API サーバーに接続すると、「error: You must be logged in to the server (Unauthorized)」というメッセージが表示されます。これを解決するにはどうすればよいですか。
簡単な説明
Amazon EKS API サーバーに接続する前に、最新バージョンの AWS コマンドラインインターフェイス (AWS CLI) をインストールして、設定します 。
次に、クラスター管理者は、以下のいずれかのセクションのステップを完了する必要があります。
- クラスター作成者の場合
- クラスター作成者ではない場合
最後に、エラーを受け取ったユーザーは You're the user or role that received the error セクションのステップを完了する必要があります。
解決方法
クラスター作成者の場合
1. AWS CLI ユーザーまたはロールの設定を確認するには、次のコマンドを実行します。
$ aws sts get-caller-identity
出力は、AWS Identity and Access Management (IAM) ユーザーまたはロールの Amazon リソースネーム (ARN) を返します。例:
{
"UserId": "XXXXXXXXXXXXXXXXXXXXX",
"Account": "XXXXXXXXXXXX",
"Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}
2. ARN がクラスター作成者と一致することを確認します。
3. 次のいずれかのコマンドを使用して、kubeconfig ファイルを更新または生成します。
IAM ユーザーとして、次のコマンドを実行します。
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
注: eks-cluster-name をご自分のクラスター名で置き換えます。aws-region をご自分の AWS リージョンに置き換えます。
IAM ロールとして、次のコマンドを実行します。
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole
注: eks-cluster-name をご自分のクラスター名で置き換えます。aws-region をご自分の AWS リージョンに置き換えます。
4. kubeconfig ファイルが更新されたことを確認するには、次のコマンドを実行します。
$ kubectl config view --minify
5. IAM ユーザーまたはロールが認証されていることを確認するには、次のコマンドを実行します。
$ kubectl get svc
出力は次のようになります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 77d
注意:EKS は、コントロールプレーン側のクラスター作成者の IAM ロールを kubernetes-admin としてマッピングします。クラスターの作成時に API サーバーロギングがアクティブ化されていた場合、エンティティ作成者を照会できます。CloudWatch Insights で以下のコマンドを実行します。
fields @logStream, @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "username=kubernetes-admin"
| limit 50
このクエリは、クラスター作成者としてマップされている IAM エンティティを返します。出力で受け取る IAM エンティティロールを想定し、クラスターに対して kubectl 呼び出しを再実行します。
クラスター作成者ではない場合
1. AWS CLI ユーザーまたはロールの設定を確認するには、次のコマンドを実行します。
$ aws sts get-caller-identity
出力は、IAM ユーザーまたはロールの ARN を返します。
2. クラスターの所有者または管理者に、IAM ユーザーまたはロールを aws-auth ConfigMap に追加するように依頼します。
注意: 正しい IAM 許可がある場合は、AssumeRole を使用してクラスター作成者としてログインすることもできます。
3. テキストエディタで aws-auth ConfigMap を編集するには、クラスターの所有者または管理者が次のコマンドを実行する必要があります。
$ kubectl edit configmap aws-auth --namespace kube-system
注: AWS IAM アイデンティティセンターの場合は、必ず「/aws-reserved/sso.amazonaws.com/REGION」を rolearnurl から削除してください。削除しないと、arn が有効なユーザーとしてあなたを承認できなくなります。
4. IAM ユーザーまたは IAM ロールを追加するには、次のいずれかのステップを実行します。
IAM ユーザーを mapUsers に追加します。例:
mapUsers: |
- userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
username: testuser
groups:
- system:masters
注:testuser を自分のユーザー名に置き換えてください。
IAM ロールを mapRolesに追加します。例:
mapRoles: |
- rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
username: testrole
groups:
- system:masters
注:testrole を自分のロールに置き換えてください。
mapRoles セクションの username の値は小文字のみ使用できます。 IAM ロールはパスなしでマップする必要があります。rolean パス要件の詳細については、「IAM のトラブルシューティング」の「aws-auth ConfigMap がクラスターへのアクセスを許可しない」セクションを展開します。
system:masters グループを使用すると、スーパーユーザーが任意のリソースで任意のアクションを実行できます。詳細については、「デフォルトのロールとロールのバインディング」を参照してください。
エラーが発生したユーザーまたはロールの場合
1. kubeconfig ファイルを aws-auth ConfigMap の更新後に更新または生成するには、次のいずれかのコマンドを実行します。
IAM ユーザーとして、次のコマンドを実行します。
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
注: eks-cluster-name をご自分のクラスター名で置き換えます。aws-region をご自分の AWS リージョンに置き換えます。
2. IAM ロールとして、次のコマンドを実行します。
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole
注: eks-cluster-name をご自分のクラスター名で置き換えます。aws-region をご自分の AWS リージョンに置き換えます。
3. kubeconfig ファイルが更新されたことを確認するには、次のコマンドを実行します。
$ kubectl config view --minify
4. IAM ユーザーまたはロールが認証されていることを確認するには、次のコマンドを実行します。
$ kubectl get svc
次のような出力が表示されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 77d
注意: 引き続きエラーが発生する場合は、「Using RBAC Authorization」のトラブルシューティングガイドラインを参照してください。