Amazon EKS クラスターにアクセスするように SSO ユーザーを設定する方法を教えてください。
AWS IAM アイデンティティセンター (AWS Single Sign-On の後継) を使っています。しかし、Amazon Elastic Kubernetes Service (Amazon EKS) クラスターにアクセスできません。クラスターにアクセスするように SSO ユーザーを設定したいです。
解決方法
次の前提条件が満たされていることを確認してください。
- IAM Identity Center を有効にして設定しました。
- SSO ユーザーは Amazon EKS クラスターが存在する AWS アカウントに関連付けられています。
注: 以下の手順では、kubectl を使用してクラスターにアクセスします。kubectl アクセスを設定すると、IAM Identity Center ユーザーとしてログインすることで Amazon EKS コンソールにクラスターリソースが表示されます。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行時にエラーが発生する場合は、最新バージョンの AWS CLI が実行されていることを確認してください。
SSO ユーザーを使用するように AWS CLI を設定する
AWS CLI コマンドを実行するときに SSO 認証を使用する AWS コマンドラインインターフェイス (AWS CLI) プロファイルを作成します。詳細については、「AWS IAM アイデンティティセンター (AWS Single Sign-On の後継) を使用するように AWS CLI を設定する」を参照してください。
以下は、自動手順を使用した AWS CLI SSO 設定の例です。
aws configure sso SSO start URL [None]: https://my-sso-portal.awsapps.com/start SSO region [None]: us-east-1
AWS CLI はデフォルトのブラウザを開き、 IAM アイデンティティセンターアカウントのログインプロセスを開始しようとします。
Attempting to automatically open the SSO authorization page in your default browser.
AWS CLI がブラウザを開くことができない場合は、ログインプロセスを手動で開始する方法が記載された次のメッセージが表示されます。
If the browser does not open or you wish to use a different device to authorize this request, open the following URL: https://device.sso.us-east-2.amazonaws.com/ Then enter the code: XXXX-XXXX The only AWS account available to you is: 123456789999 Using the account ID 123456789999 The only role available to you is: ViewOnlyAccess Using the role name "ViewOnlyAccess" CLI default client Region [us-east-2]: CLI default output format [json]: CLI profile name [ViewOnlyAccess-123456789999]: test-profile To use this profile, specify the profile name using --profile, as shown: aws s3 ls --profile test-profile
これで、この新しいプロファイルを使用して AWS CLI コマンドを実行できるようになりました。この設定により、SSO ユーザーは次の操作を行うことができます。
- AWS で認証します。
- IAM アイデンティティセンターによって作成された AWS ID および管理 (IAM) ロールを想定します。
例:
$ aws sts get-caller-identity { "UserId": "AROAXMRV33N1234567890:test-user", "Account": "123456789999", "Arn": "arn:aws:sts::123456789999:assumed-role/AWSReservedSSO_ViewOnlyAccess_05a3861234567890/test-user" }
SSO 用に作成された AWS CLI プロファイルを使用するように kubectl コンテキストを設定します
Kubectl は AWS CLI コマンドを使用します。そのため、kubectl の現在のコンテキストで新しい AWS CLI プロファイルを指定する必要があります。kubectl context を更新して新しいプロファイルを使用するには、以下のコマンドを実行します。
aws eks update-kubeconfig --name $CLUSTER-NAME --profile test-profile
このコマンドを実行すると、kubectl はプロファイル test-profile を使用してクラスター API サーバーで認証します。
パスを除外して ARN バージョンを構築する
aws-auth ConfigMap にマッピングされている IAM ロールにはパスが含まれていません。デフォルトでは、SSO ユーザーに関連付けられている IAM ロールの Amazon リソースネーム (ARN) にはパスが含まれます。
例:
arn:aws:iam::123456789999:role/aws-reserved/sso.amazonaws.com/us-east-2/AWSReservedSSO_ViewOnlyAccess_05a3861234567890
完全な ARN を aws-auth ConfigMap に追加した場合、SSO ユーザーは認証されません。SSO ユーザーを使用してクラスターにアクセスすることはできません。必ず、この ARN のバージョンをパスを含めずに構築してください。このバージョンは次の手順で使用する必要があります
例:
arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
以下のコマンドを実行して、パスなしで IAM ロールを取得することもできます。
ssorole=$(aws sts get-caller-identity --query Arn --output text --profile test-profile | cut -d/ -f2) account=$(aws sts get-caller-identity --query Account --output text --profile test-profile) echo "arn:aws:iam::$account:role/$ssorole" arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
ARN を aws-auth ConfigMap に追加します
SSO ユーザーが Amazon EKS クラスターにアクセスするには、SSO ユーザーに関連付けられている IAM ロールを Kubernetes RBAC 権限にマッピングする必要があります。そのためには、パスのない IAM ロール ARN を aws-auth ConfigMap に含めてください。次に、それを Kubernetes ユーザーと Kubernetes Role と RoleBinding (または ClusterRole と ClusterRoleBinding) にリンクされているグループにマッピングします。ユースケースに応じて、以下のセクションのいずれかの手順を使用してください。
クラスター全体の管理者権限を持つ SSO ユーザー
デフォルトでは、Kubernetes グループの system:masters はクラスター全体の管理者権限を提供します。このグループは ClusterRole cluster-admin と ClusterRoleBinding cluster-admin にリンクされています。そのため、新しい ClusterRole オブジェクトと ClusterBindingRole オブジェクトを作成する必要はありません。パスのない IAM ロールを system:masters グループにマッピングするだけで済みます。
これを行うには、aws-auth ConfigMap を編集します。
kubectl edit configmap aws-auth -n kube-system
次に、以下を追加します。
- groups: - system:masters rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 username: cluster-admin
名前空間にバウンドされた読み取り権限を持つ SSO ユーザー
この場合、特定の名前空間内で読み取り権限を持つ Role と RoleBinding を作成する必要があります。次に、aws-auth ConfigMap のカスタムユーザー名またはグループ名を使用して、これらのオブジェクトを IAM ロールにリンクします。
1. 希望する名前空間の読み取り権限のみを許可する Kubernetes Role オブジェクトを作成します。
cat << EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: $MY-NAMESPACE name: reader-role rules: - apiGroups: [""] # "" indicates the core API group resources: ["*"] verbs: ["get", "watch", "list"] EOF
注意:
- $MY-NAMESPACE を自分の名前空間の名前に置き換えてください。
- reader-role をカスタムユーザー名に置き換えます。
2. Kubernetes ロール権限を read-only-groupグループにリンクする Kubernetes RoleBinding オブジェクトを作成します。
cat <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: reader-binding namespace: MY-NAMESPACE subjects: - kind: Group name: read-only-group apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: reader-role apiGroup: rbac.authorization.k8s.io EOF
3. パスのない IAM ロール ARN を aws-auth ConfigMap の read-only-group グループにマッピングします。
次のコマンドを実行すると、IAM ロールを自動的にマッピングできます。
eksctl create iamidentitymapping \ --cluster $CLUSTER-NAME \ --region $REGION \ --arn arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 \ --group read-only-group \ --no-duplicate-arns \ --username read-only-user1
注: $CLUSTER-NAME と $REGION は、それぞれクラスターとリージョンの名前に置き換えてください。 または、IAM ロールを手動でマッピングすることもできます。これを行うには、aws-auth ConfigMap を編集します。
kubectl edit configmap aws-auth -n kube-system
次に、mapRoles セクションに以下を追加します。
- groups: - read-only-group rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 username: read-only-user1
重要: IAM ロールは aws-auth ConfigMap に 1 回だけ表示する必要があります。したがって、IAM ロールを含むセクションは 1 つだけにしてください。
これで、SSO ユーザーを使用してクラスターにアクセスできるようになりました。
$ kubectl get pod NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 24h
関連情報
関連するコンテンツ
- AWS公式更新しました 2年前
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 2年前