Amazon EKS でクラスターを作成した後に、他の IAM ユーザーやロールにクラスターへのアクセスを付与する方法を教えてください。
kubectl コマンドを使用して Amazon Elastic Kubernetes サービス (Amazon EKS) クラスターにアクセスすると、「エラー: サーバーへのログインが必要です (Unauthorized)」というエラーメッセージが発生します。
簡単な説明
AWS Identity and Access Management (IAM) ユーザーまたはロールが、aws-iam-authenticator が使用するクラスターではない Amazon EKS クラスターを作成した場合、エラーメッセージ Unauthorized が表示されます。この問題を解決するには、IAM エンティティを許可するように Amazon EKS クラスターのロールベースのアクセス制御 (RBAC) を設定します。RBAC の詳細については、Kubernetes のウェブサイトで「RBAC 認可を使用する」を参照してください。
Amazon EKS クラスターの作成者のみが、クラスターを設定するための system:masters アクセス許可を持っています。system: masters アクセス許可を他の IAM ユーザーとロールに拡張するには、次の 2 つの方法があります。
- クラスター作成者の認証情報を引き受けます。次に、aws-auth ConfigMap の mapRoles セクションに IAM ロールを追加します。
- EKS アクセスエントリを使用します。
重要: cluster_creator を ConfigMap に追加するのがベストプラクティスです。ConfigMap の設定に誤りがあると、cluster_creator を含むすべての IAM ユーザーとロールが Amazon EKS クラスターに永久にアクセスできなくなる可能性があります。デフォルトでは、cluster_creator には作成したクラスターへの管理者アクセスがあるため、cluster_creater を aws-auth ConfigMap に追加する必要はありません。
注: 次の解決策では、cluster_creator が Amazon EKS でクラスターを作成する IAM エンティティです。ユーザー designated_user にアクセス許可を付与します。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
クラスター作成者の IAM ユーザーまたはロールを特定する
Amazon EKS クラスターを設定するためのプライマリアクセス許可を持つクラスター作成者の IAM エンティティを特定します。クラスターの作成者を特定するには、AWS CloudTrail で CreateCluster API コールを検索し、その API コールの userIdentity セクションを確認します。
次に、クラスターを作成した後に認証を付与する対象の IAM エンティティを特定します。
cluster_creator が IAM ユーザーの場合は、aws-auth ConfigMap を使用してクラスターへのアクセスを付与します
次の手順を実行します。
-
ローカルホストマシンに kubectl をインストールします。または、kubectl パッケージがインストールされた専用の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスがある場合は、SSH を使用してインスタンスに接続します。
-
kubectl がインストールされているホストマシンで、designated_user 認証情報を使用して AWS CLI を設定します。
aws configure
-
AWS CLI コマンド get-caller-identity を実行します。
aws sts get-caller-identity
出力は、designated_user の IAM ユーザー詳細情報を返します。
{ "UserId": "#####################", "Account": "############", "Arn": "arn:aws:iam::############:user/designated_user" }
-
デフォルト名前空間のクラスターで実行されているポッドを一覧表示します。
kubectl get pods --namespace default
designated_user は Amazon EKS クラスターへのアクセスが許可されていないため、出力にはエラーメッセージ Unauthorized が表示されます。
-
cluster_creator の AWS アクセスキー ID と AWS シークレットアクセスキーを設定します。
Amazon EKS コンソールを使用してクラスターを作成した場合は、ローカルホストマシン上の AWS CLI で、IAM ユーザーまたはロールの cluster_creator を設定します。aws configure
eksctl を使用してクラスターを作成した場合は、指定した AWS CLI プロファイルの認証情報を使用して kubectl コマンドを実行するように、AWS CLI を設定します。
-
cluster_creator がクラスターにアクセスできることを確認します。
kubectl get pods
Unauthorized エラーメッセージは表示されず、出力にはデフォルトの名前空間で実行されているすべてのポッドが一覧表示されます。出力にリソースが表示されない場合は、デフォルトの名前空間で実行されているポッドはありません。
-
designated_user にクラスターへのアクセス許可を付与するには、**mapUsers ** セクションを aws-auth.yaml ファイルに追加します。詳細については、「Amazon EKS クラスターに IAM プリンシパルを追加する」を参照してください。
-
designated_user を aws-auth.yaml ファイルの mapUsers セクションに追加したら、ファイルを保存します。
-
新しい ConfigMap をクラスターの RBAC 設定に適用します。
kubectl apply -f aws-auth.yaml
-
designated_user の認証情報を使用するように、AWS CLI 設定を再度変更します。
aws configure
- designated_user がクラスターにアクセスできることを確認します。
kubectl get pods
Unauthorized エラーメッセージは表示されず、出力にはデフォルトの名前空間で実行されているすべてのポッドが一覧表示されます。出力にリソースが表示されない場合は、デフォルトの名前空間で実行されているポッドはありません。
cluster_creator が IAM ロールの場合は、aws-auth ConfigMap を使用してクラスターアクセスを許可します
IAM ユーザーではなく、IAM ロールがクラスターを作成した場合、認証情報を使用することはできません。代わりに、クラスターを作成した IAM ロールを引き受けることで、designated_user へのアクセスを許可する必要があります。
次の手順を実行します。
-
get-caller-identity AWS CLI コマンドを実行して、assume_role_user の IAM ユーザー詳細情報を取得します。
aws sts get-caller-identity
-
assume_role_user がクラスターにアクセスできることを確認します。
kubectl get pods
designated_user は Amazon EKS クラスターへのアクセスが許可されていないため、出力にはエラーメッセージ Unauthorized が表示されます。
-
assume_role_user が cluster_creator のロールを引き受けられるようにします。
aws sts assume-role --role-arn arn:aws:iam:11122223333:role/cluster_creator --role-session-name test
出力には、assume_role_user 用の一時的な IAM 認証情報が表示されます。
-
その一時的な IAM 認証情報を使用して、環境変数 AWS_ACCESS_KEY_ID、AWS_SESSION_TOKEN、AWS_SECRET_ACCESS_KEY を設定します。
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE export AWS_SESSION_TOKEN=EXAMPLETOKEN export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS CLI は、環境変数に設定された認証情報をランク付けし、それらを使用して AWS サービスを呼び出します。
-
AWS CLI が、cluster_creator 用の引き受けたロールを使用していることを確認します。
aws sts get-caller-identity
-
designated_user にクラスターへのアクセス許可を付与するには、**mapUsers ** セクションを aws-auth.yaml ファイルに追加します。
-
designated_user を aws-auth.yaml ファイルの mapUsers セクションに追加したら、ファイルを保存します。
-
Amazon EKS クラスターの RBAC 設定に新しい設定を適用します。
kubectl apply -f aws-auth.yaml
-
次の環境変数を削除します。
unset AWS_ACCESS_KEY_ID unset AWS_SESSION_TOKEN unset AWS_SECRET_ACCESS_KEY
-
AWS CLI コマンド get-caller-identity を実行し、designated_user の IAM ユーザー詳細情報を取得します。
aws sts get-caller-identity
- designated_user がクラスターにアクセスできることを確認します。
kubectl get pods
Unauthorized エラーメッセージは表示されず、出力にはデフォルトの名前空間で実行されているすべてのポッドが一覧表示されます。出力にリソースが表示されない場合は、デフォルトの名前空間で実行されているポッドはありません。
注: eksctl を使用する場合の詳細については、eksctl のウェブサイトで「IAM ユーザーとロールの管理」を参照してください。
EKS アクセスエントリを使用して IAM ユーザーとロールにクラスターへのアクセス許可を付与する
Amazon EKS は、アクセスエントリの認証に 3 つのモードをサポートしています。
- CONFIG_MAP では、aws-auth ConfigMap のみを使用します。
- API_AND_CONFIG_MAP では、EKS アクセスエントリ API および aws-auth ConfigMap を使用します。このモードは EKS アクセスエントリによる認証を優先します。既存の aws-auth アクセス許可を EKS アクセスエントリに移行する必要がある場合に便利です。
- API では、EKS アクセスエントリ API のみを使用します。
詳細については、「IAM ユーザーとロールに Kubernetes API へのアクセスを付与する」を参照してください。
アクセスエントリを使用してクラスターを構成するには、クラスター認証モードを EKS API または EKS API および ConfigMap に設定します。
クラスターの現在の認証モードを確認するには、次の手順を実行します。
- Amazon EKS コンソールを開きます。
- [アクセス] タブを選択します。
- [アクセス構成] で、[認証モード] ラベルを確認します。
または、describe-cluster コマンドを実行します。
aws eks describe-cluster --name example-cluster --query 'cluster.accessConfig.authenticationMode' --region exampleRegion
クラスターの認証モードが EKS API または EKS API および ConfigMap の場合は、アクセスエントリを使用するようにクラスターを構成できます。そうでない場合は、「アクセスエントリを使用するように認証モードを変更する」を参照してください。
注: CONFIG_MAP 認証モードを API モードに切り替えることはできますが、API または API_AND_CONFIG_MAP モードから CONFIG_MAP に切り替えることはできません。詳細については、GitHub のウェブサイトで「クラスターアクセスマネージャー」を参照してください。
関連情報
EKS アクセスエントリを使用して IAM ユーザーに Kubernetes へのアクセス許可を付与する
既存の aws-auth ConfigMap エントリをアクセスエントリに移行する
Amazon EKS アクセスエントリ API を使用して EKS クラスターへのアクセスを回復する方法を教えてください
関連するコンテンツ
- AWS公式更新しました 1年前
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前
- AWS公式更新しました 9ヶ月前