Amazon EKS でクラスターを作成した後、他のユーザーやロールにアクセス権限を付与する方法

最終更新日: 2019 年 5 月 29 日

kubectl commands を介して Amazon Elastic Kubernetes サービス (Amazon EKS) クラスターにアクセスしようとすると、次の認証エラーが発生します。「エラー: サーバーにログインしている必要があります (未承認)」。 どうすればこのエラーを修正できますか?

簡単な説明

AWS Identity and Access Management (IAM) エンティティが Amazon EKS クラスターのロールベースアクセス制御 (RBAC) 設定によって承認されていない場合、承認エラーが発生します。これは、Amazon EKS クラスターを aws-iam-authenticator で使用しているものとは異なる IAM ユーザーまたはロールで作成した場合に発生します。最初は、Amazon EKS クラスターの作成者のみがクラスターを設定するための system:masters 権限を持っています。system:masters 権限を他のユーザーとロールに拡張するには、aws-auth ConfigMap を Amazon EKS クラスターの設定に追加する必要があります。ConfigMap により、ユーザーやロールなどの他の IAM エンティティに Amazon EKS クラスターへのアクセス権限が付与されます。

解決方法

次の手順を完了する前に、Amazon EKS クラスターを設定するためのマスターアクセス権を持つ IAM ユーザー (クラスター作成者) を特定します。また、クラスター作成者がクラスター作成後に許可を付与する IAM ユーザーを特定します。クラスター作成者を特定するには、AWS CloudTrail で CreateCluster API 呼び出しを検索してから、API 呼び出しの userIdentity セクションを確認します。

注意: 以下のステップでは、クラスター作成者は cluster_creator、指定ユーザーは designated_user です。必ず IAM rolearn を自分のアカウントに適した値に置き換えてください。

Amazon EKS クラスターの RBAC 設定に ConfigMap を追加する

1.    SSH を使用して kubectl インスタンスに接続します。

2.    AWS コマンドラインインターフェイス (CLI) で、次のコマンドを実行します。

aws sts get-caller-identity

出力には、designated_user の IAM ユーザーの詳細が表示されます。

3.    デフォルトのネームスペースのクラスタで実行されているポッドを一覧表示するには、次の kubectl コマンドを実行します。

kubectl get pods

出力結果は次のとおりです。「エラー: サーバーにログインしている必要があります (未承認)」。 このエラーは、designated_user に Amazon EKS クラスターにアクセスする権限がないことを意味します。

4.    AWS アクセスキー ID と AWS シークレットアクセスキー cluster_creator を設定するには、次のコマンドを実行します。

aws configure

5.    cluster_creator がクラスターにアクセスできることを確認するには、次のコマンドを実行します。

kubectl get pods

未承認のエラーメッセージを受け取ることはないはずです。出力には、デフォルトのネームスペースで実行されているすべてのポッドが一覧表示されます。出力にリソースが見つからないことが示された場合、ポッドは実行されていません。

6.    designated_user にクラスターへのアクセス権を付与するには、mapRoles セクションを aws-auth.yaml ファイルに追加します。次の例を参照してください。

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

7.    mapUsers セクションに designated_user を追加してから、変更内容をファイルに保存します。次の例を参照してください。

apiVersion: v1 
kind: ConfigMap 
metadata: 
  name: aws-auth 
  namespace: kube-system 
data: 
  mapRoles: | 
    - rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B 
      username: system:node:{{EC2PrivateDNSName}} 
      groups: 
        - system:bootstrappers 
        - system:nodes 
  mapUsers: | 
    - userarn: arn:aws:iam::11122223333:user/designated_user 
      username: designated_user 
      groups: 
        - system:masters

注意: 上記の例の username は、userarn で渡された IAM エンティティにマップするために Kubernetes が使用する名前です。

8.    新しい ConfigMap をクラスターの RBAC 設定に適用するには、次のコマンドを実行します。

kubectl apply -f aws-auth.yaml

9.    AWS CLI 設定を再度変更して designated_user の認証情報を使用するには、次のコマンドを実行します。

aws configure

10.    designated_user がクラスターにアクセスできることを検証するには、次のコマンドを実行します。

kubectl get pods

未承認のエラーメッセージを受け取ることはないはずです。出力には、デフォルトのネームスペースで実行されているすべてのポッドが一覧表示されます。出力にリソースが見つからないことが示された場合、ポッドは実行されていません。

IAM ロールを使用して、specified_user へのアクセスを付与する

1.    IAM ユーザーの designated_user の詳細を表示するには、次のコマンドを実行します。

aws sts get-caller-identity

2.    designated_user がクラスターにアクセスできることを確認するには、次のコマンドを実行します。

kubectl get pods

出力には次のエラーが表示されます。「エラー: サーバーにログインしている必要があります (未承認)」。 このエラーは、指定されたユーザーに Amazon EKS クラスターを設定する権限がないことを意味します。

3.    designated_usercluster_creator のロールを引き受けるようにするには、次のコマンドを実行します。

aws sts assume-role --role-arn arn:aws:iam:11122223333:role/cluster_creator --role-session-name test

出力には、cluster_creator のロールを引き受けている designated_user の一時的な IAM 認証情報が表示されます。

4.    一時的な IAM 認証情報を使用して、AWS_ACESS_KEY_IDAWS_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.    aws-auth.yaml ファイルに mapRoles を追加します。次の例を参照してください。

apiVersion: v1 
kind: ConfigMap 
metadata: 
  name: aws-auth 
  namespace: kube-system 
data: 
  mapRoles: | 
    - rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
      username: system:node:{{EC2PrivateDNSName}} 
      groups: 
        - system:bootstrappers 
        - system:nodes 
  mapUsers: | 
    - userarn: arn:aws:iam::11122223333:user/designated_user 
      username: designated_user 
      groups: 
        - system:masters

注意: 上記の例の username は、userarn で渡された IAM エンティティにマップするために Kubernetes が使用する名前です。

7.    aws-auth.yaml ファイルに designated_user を追加してから、変更内容を保存します。

8.    新しい設定を Amazon EKS クラスターの RBAC 設定に適用するには、次のコマンドを実行します。

kubectl apply -f aws-auth-cm.yml

9.    以下の環境変数の設定を解除するには、次のコマンドを実行します。

unset AWS_ACCESS_KEY_ID
            unset AWS_SESSION_TOKEN
            unset AWS_SECRET_ACCESS_KEY

10.    IAM ユーザーの designated_user の詳細を表示するには、次のコマンドを実行します。

aws sts get-caller-identity

11.    designated_user がクラスターにアクセスできることを確認するには、次のコマンドを実行します。

kubectl get pods

未承認のエラーメッセージを受け取ることはないはずです。出力には、デフォルトのネームスペースで実行されているすべてのポッドが一覧表示されます。出力にリソースが見つからないことが示された場合、ポッドは実行されていません。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合