Skip to content

EKSクラスター接続時「You must be logged in」エラーの解決法

問題説明

AWS EKSクラスターにローカル環境のkubectlで接続しようとした際、次のようなエラーメッセージが発生する場合があります:

shell
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コンソールでの操作方法:

  1. AWSコンソール > EKS > 対象クラスターを選択
  2. 「アクセス」タブ → 「アクセスエントリー」セクション
  3. 「アクセスエントリーを作成」をクリック
  4. IAMユーザー/ロールのARNを入力し、タイプは「標準」を選択
  5. ポリシーを割り当て(例: AmazonEKSAdminPolicy

AWS CLIでの操作方法:

bash
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接続時に使用しているアカウントが異なると発生

bash
# 現在の認証情報を確認
aws sts get-caller-identity

# 認証情報を再設定
aws configure

TIP

変更後は新しいターミナルを開く必要があります。既存ターミナルでは認証情報が更新されない場合があります。

3. クレデンシャルファイルの問題

一時的なセッショントークン使用時に発生する場合、aws_session_token行をコメントアウト

~/.aws/credentials ファイルを編集:

ini
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
# aws_session_token = ...   ← この行をコメントアウト

4. kubeconfig設定の不備

クラスター情報が古い場合、kubeconfigを更新する必要があります

bash
# kubeconfigの更新
aws eks update-kubeconfig --name your-cluster-name --region your-region

# 設定内容を確認
cat ~/.kube/config

5. 環境変数の上書き問題

他のツールで設定されたAWS認証環境変数が影響する場合

bash
# 環境変数を確認
env | grep AWS_

# 不要な環境変数を解除
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY

6. パブリックアクセスの制限

パブリックアクセスが無効になっている場合の一時的対策(非推奨)

hcl
# Terraformでのパブリックアクセス許可例
module "eks" {
  cluster_endpoint_public_access = true # 本番環境では非推奨
}

追加のトラブルシューティング

アクセスポリシーの詳細設定

適切なアクセスポリシーをTerraformで設定する例:

hcl
# 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エンティティ間の信頼関係が確立されていないことです。予防策として:

  1. クラスター作成後の最初のステップとしてアクセスエントリーを追加
  2. IAMポリシーとkubeconfigの整合性を定期的に監査
  3. 本番環境ではパブリックアクセスを制限し、VPC内からのアクセスを推奨

エラー解決後は、kubectl get nodesが正常に実行できるか確認してください。クラスター管理アクセスはセキュリティ上重要ですので、一時的な回避策ではなく、適切なIAM設定による解決を常に心がけてください。