Amazon EKS でクラスターを作成した後、他の IAM ユーザーおよびロールにアクセス権を付与するにはどうすればよいですか?
kubectl コマンドを介して Amazon Elastic Kubernetes Service (Amazon EKS) クラスターにアクセスしようとすると、「error: You must be logged in to the server (Unauthorized).」(エラー: サーバーにログインしている必要があります (未承認)。) という認証エラーが発生します。
簡単な説明
AWS Identity and Access Management (IAM) エンティティが Amazon EKS クラスターのロールベースアクセス制御 (RBAC) 設定によって承認されていない場合、承認エラーが発生します。これは、IAM ユーザーまたはロールが aws-iam-authenticator によって使用されるものとは異なる Amazon EKS クラスターを作成した場合に発生します。
最初は、Amazon EKS クラスターの作成者のみがクラスターを設定するための system:masters 許可を持っています。system:masters 許可を他のユーザーとロールに拡張するには、aws-auth ConfigMap を Amazon EKS クラスターの設定に追加する必要があります。ConfigMap により、ユーザーやロールなどの他の IAM エンティティに Amazon EKS クラスターへのアクセス権限が付与されます。
IAM ロールにアクセス権を付与するには、クラスター作成者の認証情報を引き受ける必要があります。その後、aws-auth ConfigMap の mapRoles セクションに IAM ロールを追加します。
重要:
- aws-auth ConfigMap を更新するときは、構文エラー (タイプミスなど) を避けてください。これらのエラーは、Amazon EKS クラスターの ConfigMap 内で更新されたすべての IAM ユーザーおよびロールの許可に影響を与える可能性があります。
- cluster_creator を ConfigMap に追加しないようにするのがベストプラクティスです。ConfigMap を不適切に変更すると、cluster_creator を含むすべての IAM ユーザーとロールが Amazon EKS クラスターに永久にアクセスできなくなる可能性があります。
- Amazon EKS クラスターへの管理者アクセスを取得するために、aws-auth ConfigMap に cluster_creator を追加する必要はありません。デフォルトでは、cluster_creator は、作成した Amazon EKS クラスターへの管理者アクセス権を持ちます。
注: AWS Command Line Interface (AWS CLI) のコマンド実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
解決方法
注: 次の手順では、クラスター作成者は cluster_creator です。現在、クラスターにアクセスできないが、アクセス権が必要なユーザーは designated_user です。
クラスター作成者の IAM ユーザーまたはロールを特定する
1. Amazon EKS クラスターを設定するためのプライマリアクセス権を持つクラスター作成者の IAM ユーザーまたはロールを特定します。
2. クラスター作成者がクラスター作成後に権限を付与する IAM ユーザーを特定します。クラスター作成者を特定するには、AWS CloudTrail で CreateCluster API コールを検索してから、API コールの userIdentity セクションを確認します。
ConfigMap に designated_user を追加する (cluster_creator が IAM ユーザーである場合)
1. ローカルホストマシンに kubectl をインストールします。または、kubectl パッケージがインストールされた Amazon Elastic Compute Cloud (Amazon EC2) 専用インスタンスがある場合は、SSH を使用してインスタンスに接続します。
2. kubectl がインストールされている同じホストマシンで、designated_user の認証情報を使用して AWS CLI を設定します。
aws configure
3. AWS CLI で、次のコマンドを実行します。
aws sts get-caller-identity
この出力は、designated_user の IAM ユーザーの詳細を返します。
例:
{ "UserId": "XXXXXXXXXXXXXXXXXXXXX", "Account": "XXXXXXXXXXXX", "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/designated_user" }
4. デフォルトの名前空間のクラスターで実行されているポッドを一覧表示します。
kubectl get pods --namespace default
出力結果では、「error: You must be logged in to the server (Unauthorized).」(エラー: サーバーにログインしている必要があります (未承認)。) と表示されます。 このエラーは、designated_user に Amazon EKS クラスターにアクセスする権限がないことを意味します。
5. cluster_creator の AWS アクセスキー ID と AWS シークレットアクセスキーを設定します。
AWS マネジメントコンソールを使用してクラスターを作成した場合は、クラスターを作成した IAM ロールまたはユーザーを特定します。kubectl がインストールされているホストマシンで、AWS CLI で cluster_creator の IAM ユーザーまたはロールを設定します。
aws configure
eksctl を使用してクラスターを作成した場合は、デフォルトまたは指定された AWS CLI プロファイル認証情報を使用して、kubectl コマンドを実行するように AWS CLI を設定します。
6. cluster_creator がクラスターにアクセスできることを確認します。
kubectl get pods
すべてが正しく設定されていれば、不正なエラーのメッセージは表示されません。出力には、デフォルトの名前空間で実行されているすべてのポッドが一覧表示されます。リソースが見つからなかった旨が出力に表示される場合、デフォルトの名前空間で実行されているポッドはありません。
7. designated_user にクラスターへのアクセス権を付与するには、mapUsers セクションを aws-auth.yaml ファイルに追加します。「クラスターへの IAM ユーザーおよびロールアクセスを有効にする」の aws-auth.yaml ファイルの例を参照してください。
8. ステップ 7 で aws-auth.yaml ファイルの mapUsers セクションに designated_user を追加し、ファイルを保存します。
9. 新しい ConfigMap をクラスターの RBAC 設定に適用します。
kubectl apply -f aws-auth.yaml
10. designated_user の認証情報を使用するように AWS CLI 設定を再度変更します。
aws configure
11. designated_user がクラスターにアクセスできることを確認します。
kubectl get pods
すべてが正しく設定されていれば、不正なエラーのメッセージは表示されません。出力には、デフォルトの名前空間で実行されているすべてのポッドが一覧表示されます。リソースが見つからなかった旨が出力に表示される場合、デフォルトの名前空間で実行されているポッドはありません。
ConfigMap に designated_user を追加する (cluster_creator が IAM ロールの場合)
前のステップでは、cluster_creator の認証情報を使用して designated_user へのアクセス権を付与しました。ただし、IAM ロールが IAM ユーザーではなくクラスターを作成した場合、使用できる認証情報はありません。この場合、designated_user へのアクセス権を付与するために、クラスターを作成した IAM ロールを引き受ける必要があります。クラスター作成者が IAM ロールでない場合は、次のステップを完了する必要はありません。
注: 次の手順では、assume_role_user は cluster_creator ロールを引き受けるユーザーです。現在、クラスターにアクセスできないが、アクセス権が必要なユーザーは designated_user です。
IAM ロールを引き継ぎ、クラスターで aws-auth ConfigMap を編集して designated_user へのアクセスを許可できるようにするには、次のステップを実行します。
1. assume_role_user の IAM ユーザーの詳細を表示します。
aws sts get-caller-identity
2. assume_role_user がクラスターにアクセスできることを確認します。
kubectl get pods
出力結果では、「error: You must be logged in to the server (Unauthorized).」(エラー: サーバーにログインしている必要があります (未承認)。) というエラーが表示されます。 このエラーは、assume_role_user に Amazon EKS クラスターを設定する権限がないことを意味します。
3. 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 認証情報が表示されます。
4. 一時的な 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 のサービスを呼び出します。
5. AWS CLI が cluster_creator 用に引き受けたロールを使用していることを確認します。
aws sts get-caller-identity
6. designated_user にクラスターへのアクセス権を付与するには、mapUsers セクションを aws-auth.yaml ファイルに追加します。「クラスターへの IAM ユーザーおよびロールアクセスを有効にする」の aws-auth.yaml ファイルの例を参照してください。
7. ステップ 6 で aws-auth.yaml ファイルの mapUsers セクションに designated_user を追加し、ファイルを保存します。
8. Amazon EKS クラスターの RBAC 設定に新しい設定を適用します。
kubectl apply -f aws-auth.yaml
9. 次の環境変数の設定を解除します。
unset AWS_ACCESS_KEY_ID unset AWS_SESSION_TOKEN unset AWS_SECRET_ACCESS_KEY
10. designated_user の IAM ユーザーの詳細を表示します。
aws sts get-caller-identity
11. designated_user がクラスターにアクセスできることを確認します。
kubectl get pods
すべてが正しく設定されていれば、不正なエラーのメッセージは表示されません。出力には、デフォルトの名前空間で実行されているすべてのポッドが一覧表示されます。リソースが見つからなかった旨が出力に表示される場合、デフォルトの名前空間で実行されているポッドはありません。
注: eksctl を使用する場合は、Weaveworks ウェブサイトの IAM ユーザーとロールの管理で解決することを検討してください。
関連情報
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 4ヶ月前lg...
- AWS公式更新しました 3ヶ月前
- AWS公式更新しました 1年前