EKSクラスター接続時「You must be logged in」エラーの解決法
問題説明
AWS EKSクラスターにローカル環境のkubectl
で接続しようとした際、次のようなエラーメッセージが発生する場合があります:
E0209 21:09:44.893284 2465691 memcache.go:238] couldn't get current server API group list: the server has asked for the client to provide credentials
error: You must be logged in to the server (the server has asked for the client to provide credentials)
このエラーは、kubectlがEKS APIサーバーに対して適切な認証情報を提供できていないことを示しています。aws configure
で正しい認証情報を設定しているにもかかわらず発生することから、根本的な原因は複数考えられます。
主な原因と解決策
1. EKSアクセスエントリーの不足(推奨解決策)
AWS EKSでは、IAMユーザー/ロールごとに明示的なアクセスエントリーを追加する必要があります。
AWSコンソールでの操作方法:
- AWSコンソール > EKS > 対象クラスターを選択
- 「アクセス」タブ → 「アクセスエントリー」セクション
- 「アクセスエントリーを作成」をクリック
- IAMユーザー/ロールのARNを入力し、タイプは「標準」を選択
- ポリシーを割り当て(例:
AmazonEKSAdminPolicy
)
AWS CLIでの操作方法:
aws eks create-access-entry \
--cluster-name your-cluster-name \
--principal-arn arn:aws:iam::111122223333:user/your-username
WARNING
適切な権限付与が必須です。開発環境ではAmazonEKSAdminPolicy
を、本番環境では必要最小限の権限を付与してください。
2. AWS認証情報の不一致
クラスター作成時に使用したAWSアカウントと、kubectl
接続時に使用しているアカウントが異なると発生
# 現在の認証情報を確認
aws sts get-caller-identity
# 認証情報を再設定
aws configure
TIP
変更後は新しいターミナルを開く必要があります。既存ターミナルでは認証情報が更新されない場合があります。
3. クレデンシャルファイルの問題
一時的なセッショントークン使用時に発生する場合、aws_session_token
行をコメントアウト
~/.aws/credentials
ファイルを編集:
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
# aws_session_token = ... ← この行をコメントアウト
4. kubeconfig設定の不備
クラスター情報が古い場合、kubeconfigを更新する必要があります
# kubeconfigの更新
aws eks update-kubeconfig --name your-cluster-name --region your-region
# 設定内容を確認
cat ~/.kube/config
5. 環境変数の上書き問題
他のツールで設定されたAWS認証環境変数が影響する場合
# 環境変数を確認
env | grep AWS_
# 不要な環境変数を解除
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
6. パブリックアクセスの制限
パブリックアクセスが無効になっている場合の一時的対策(非推奨)
# Terraformでのパブリックアクセス許可例
module "eks" {
cluster_endpoint_public_access = true # 本番環境では非推奨
}
追加のトラブルシューティング
アクセスポリシーの詳細設定
適切なアクセスポリシーをTerraformで設定する例:
# IAMユーザーのARN取得
data "aws_iam_user" "example" {
user_name = "your-username"
}
# アクセスエントリーの作成
resource "aws_eks_access_entry" "example" {
cluster_name = aws_eks_cluster.example.name
principal_arn = data.aws_iam_user.example.arn
type = "STANDARD"
}
# ポリシー割り当て
resource "aws_eks_access_policy_association" "admin_policy" {
cluster_name = aws_eks_cluster.example.name
policy_arn = "arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminPolicy"
principal_arn = aws_eks_access_entry.example.principal_arn
access_scope {
type = "cluster"
}
}
WARNING
本番環境ではAmazonEKSAdminPolicy
ではなく、必要最小限の権限のみを付与してください。
根本原因と予防策
このエラーの本質的な原因は、EKSクラスターとIAMエンティティ間の信頼関係が確立されていないことです。予防策として:
- クラスター作成後の最初のステップとしてアクセスエントリーを追加
- IAMポリシーとkubeconfigの整合性を定期的に監査
- 本番環境ではパブリックアクセスを制限し、VPC内からのアクセスを推奨
エラー解決後は、kubectl get nodes
が正常に実行できるか確認してください。クラスター管理アクセスはセキュリティ上重要ですので、一時的な回避策ではなく、適切なIAM設定による解決を常に心がけてください。