AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

Amazon EKS アクセスエントリ API を使用して EKS クラスターへのアクセスを回復する方法を教えてください。

所要時間2分
0

シングルサインオンユーザーの変更、または aws-auth ConfigMap の削除または破損が原因で、Amazon Elastic Kubernetes Service (Amazon EKS) にアクセスできません。

簡単な説明

EKS クラスターにアクセスできなくなった場合、kubectl コマンドを実行すると、次のようなエラーが表示されます。

「エラー: サーバーへのログインが必要です (認証失敗)」

クラスターへのアクセスを回復するには、アクセスエントリを使用して AWS Identity and Access Management (IAM) プリンシパルのアクセス許可を管理します。これは Amazon EKS クラスターの外部から行います。

注: EKS クラスターの作成者が存在する場合は、EKS クラスター作成者の IAM プリンシパルを引き受け、ログインしてクラスターにアクセスします。デフォルトでは、EKS クラスターの作成者はクラスターの管理者です。以下のプロセスでは、クラスター作成者の元の IAM ロールと共存する管理者ロールを作成します。

解決策

前提条件

  • kubectl をインストールします。
  • 最新バージョンの AWS コマンドラインインターフェイス (AWS CLI) をインストールして設定します。
  • 次のアクセス許可を持つ IAM ロールが必要です。 CreateAccessEntry、ListAccessEntries、DescribeAccessEntry、DeleteAccessEntry、UpdateAccessEntry

注: AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

AWS EKS アクセスエントリ API を使用して Amazon EKS クラスターアクセスを管理する

注: 次のコマンドでは、以下を置き換えます。
<ACCOUNT_ID> は、EKS クラスターのあるソースアカウントのアカウント ID に置き換えます。
<REGION> は、お使いの AWS リージョンの名前に置き換えます。
<CLUSTER_NAME> は、お使いの EKS クラスターの名前に置き換えます。
<IAM_PRINCIPAL_ARN> は、管理者アクセス許可を持たせるロールの ARN に置き換えます。

AWS EKS アクセスエントリ API を使用して Amazon EKS クラスターアクセスを管理するには、次の手順を実行します。

  1. kubectl がインストールされているホストマシンで、以下のアクセス許可を持つ IAM ロールを引き受けます。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "eks:ListAccessEntries",
                    "eks:CreateAccessEntry",
                    "eks:DescribeCluster",
                    "eks:UpdateClusterConfig"
                ],
                "Resource": [
                     "arn:aws:eks:<REGION>:<ACCOUNT_ID>:cluster/<CLUSTER_NAME>"
               ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "eks:DeleteAccessEntry",
                    "eks:ListAssociatedAccessPolicies",
                    "eks:DisassociateAccessPolicy",
                    "eks:AssociateAccessPolicy",
                    "eks:UpdateAccessEntry",
                    "eks:DescribeAccessEntry"
                ],
                "Resource": [
                     "arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<CLUSTER_NAME>/*"
               ]
            }
        ]
    }
  2. ID を確認するには、以下のコマンドを実行します。

    aws sts get-caller-identity

    コマンドの出力で得た ARN を書き留めます。次のような形式となります。arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin

  3. 次のコマンドを実行して Amazon EKS クラスターの現在の認証モードを確認します。

    aws eks describe-cluster --name <CLUSTER_NAME>  --query 'cluster.accessConfig.authenticationMode' --region <REGION>

    Amazon EKS クラスターの現在の認証モードが API_AND_CONFIG_MAP の場合、既にクラスターでは必要なアクセスモードを使用しています。ステップ 5 までスキップします。

  4. 次のコマンドを実行して Amazon EKS クラスターの認証モードを更新します。

    aws eks update-cluster-config --name <CLUSTER_NAME> --access-config authenticationMode=API_AND_CONFIG_MAP --region <REGION>

    注: CONFIG_MAP 認証モードから API モードに切り替えることはできますが、API モードから CONFIG_MAP モードに戻すことはできません。

  5. 次のコマンドを実行して、クラスターと IAM ロールのアクセスエントリを作成します。

    aws eks create-access-entry --cluster-name <CLUSTER_NAME> --principal-arn <IAM_PRINCIPAL_ARN> --region <REGION>

    出力は次のようになります。

    {
        "accessEntry": {
            "clusterName": "<CLUSTER_NAME>",
            "principalArn": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
            "kubernetesGroups": [],
            "accessEntryArn": "arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<CLUSTER_NAME>/user/<ACCOUNT_ID>/new-cluster-admin/26c6d1f8-4211-3fe0-f9d2-734b912dcd9a",
            "createdAt": "2024-02-13T19:27:45.370000+00:00",
            "modifiedAt": "2024-02-13T19:27:45.370000+00:00",
            "tags": {},
            "username": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
            "type": "STANDARD"
        }
    }
  6. 次のコマンドを実行して、AmazonEKSClusterAdminPolicy を Amazon EKS クラスターと IAM ロールに関連付けます。

    aws eks associate-access-policy --cluster-name <CLUSTER_NAME> \
      --principal-arn <IAM_PRINCIPAL_ARN> \
      --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
      --access-scope type=cluster \
      --region <REGION>

    出力は次のようになります。

    {
        "accessEntry": {
            "clusterName": "<CLUSTER_NAME>",
            "principalArn": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
            "kubernetesGroups": [],
            "accessEntryArn": "arn:aws:eks:<REGION>:<ACCOUNT_ID>:access-entry/<cluster_name>/user/<ACCOUNT_ID>/new-cluster-admin/7ec6efb3-31c8-edcf-3039-ca2b38e0d708",
            "createdAt": "2024-02-25T08:34:06.002000+00:00",
            "modifiedAt": "2024-02-25T08:34:06.002000+00:00",
            "tags": {},
            "username": "arn:aws:iam::<ACCOUNT_ID>:user/new-cluster-admin",
            "type": "STANDARD"
        }
    }
  7. kubeconfig ファイルを更新または生成するには、次のコマンドを実行して EKS クラスターに接続します。

    aws eks update-kubeconfig --name <CLUSTER_NAME> --region <REGION>
  8. 次のコマンドを実行して、ユーザーが管理者として EKS クラスターにアクセスできることを確認します。

    kubectl auth can-i '*' '*'  --all-namespaces

**注:**管理者として EKS クラスターにアクセスできる場合、出力には yes と表示されます。

関連情報

簡素化された Amazon EKS アクセス管理コントロールの詳細

Amazon EKS API サーバーに接続したときに「You must be logged in to the server (Unauthorized)」(サーバーにログインする必要があります (未承認)) というエラーを解決する方法を教えてください

EKS アクセスエントリ (eksctl のウェブサイト)

AWS公式
AWS公式更新しました 8ヶ月前
コメントはありません