Amazon EKS で OIDC プロバイダーと IRSA をトラブルシューティングするにはどうすればいいですか?
このポッドでは、Amazon Elastic Kubernetes Service (Amazon EKS) アカウントトークンで AWS Identity and Access Management (IAM) ロールのアクセス許可を使用できません。
簡単な説明
Amazon EKS の OpenID Connect (OIDC) プロバイダーおよび IAM ロールのサービスアカウント (IRSA) に関する問題をトラブルシューティングするには、次のいずれかのセクションに記載されている手順を実行します。
- クラスターに既存の IAM OIDC プロバイダーがあるかどうかを確認する
- IAM ロールに、必要なアクセス権限を持つ needful IAM ポリシーがアタッチされているかどうかを確認する
- IAM ロールの信頼関係が正しく設定されていることを確認する
- サービスアカウントを作成したか確認する
- サービスアカウントに正しい IAM ロールアノテーションがあることを確認する
- ポッドで serviceAccountName が正しく指定されていることを確認する
- 環境変数と許可を確認する
- アプリケーションがサポートされている AWS SDK を使用していることを確認する
- ポッドのユーザーとグループを確認する
- ポッドを再作成する
- オーディエンスが正しいことを確認する
- サムプリントが正しいことを確認する
- AWS 中国リージョンの場合は、AWS_DEFAULT_REGION 環境変数を確認する
解決方法
クラスターに既存の IAM OIDC プロバイダーがあるかどうかを確認する
プロバイダーが既に存在する場合は、次のメッセージのようなエラーが表示されます。
「WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400」(「WebIdentityErr: 認証情報を取得できませんでした\ n原因: InvalidIdentityToken: https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus コード: 400 の OpenIDConnect プロバイダーがアカウントに見つかりません」)
1. クラスターの OIDC プロバイダーの URL を表示します。
$ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
次の出力例を参照してください。
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
2. アカウントの IAM OIDC プロバイダーを一覧表示します。EXAMPLED539D4633E53DE1B716D3041E (< > を含む) を前のコマンドから返された値に置き換えます。
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
次の出力例を参照してください。
"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
上記のコマンドが出力を返す場合、クラスターのプロバイダーは既に存在します。コマンドが出力を返さない場合は、IAM OIDC プロバイダーを作成する必要があります。
IAM ロールに、必要なアクセス権限を持つ needful IAM ポリシーがアタッチされているかどうかを確認する
1. IAM コンソールを開きます。
2. ナビゲーションペインで [Roles] を選択します。
3. 確認するロールを選択します。
4. [Permissions] タブで、このロールに必要なポリシーがアタッチされているかどうかを確認します。
IAM ロールの信頼関係が正しく設定されていることを確認する
AWS マネジメントコンソールを開きます。
1. IAM コンソールを開きます。
2. ナビゲーションペインで [Roles] を選択します。
3. 確認するロールを選択します。
4. Trust Relationships タブを選択し、ポリシーのフォーマットが以下の JSON ポリシーのフォーマットと一致することを確認します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com" } } } ] }
信頼関係を確認するには、AWS コマンドラインインターフェイス (AWS CLI) でロール名を指定して次のコマンドを実行します。
$ aws iam get-role --role-name EKS-IRSA
注: EKS-IRSA をお使いの IAM ロール名に置き換えてください。
出力 JSON で、AssumeRolePolicyDocument セクションを探します。
次の出力例を参照してください。
{ "Role": { "Path": "/", "RoleName": "EKS-IRSA", "RoleId": "AROAQ55NEXAMPLELOEISVX", "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA", "CreateDate": "2021-04-22T06:39:21+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME" } } } ] }, "MaxSessionDuration": 3600, "RoleLastUsed": { "LastUsedDate": "2021-04-22T07:01:15+00:00", "Region": "AWS_REGION" } } }
注: 正しい AWS リージョン、Kubernetes サービスアカウント名、Kubernetes 名前空間が指定されていることを確認してください。
サービスアカウントを作成したか確認する
次のコマンドを実行します。
$ kubectl get sa -n YOUR_NAMESPACE
注: YOUR_NAMESPACE を自分の名前空間に置き換えます。
次の出力例を参照してください。
NAME SECRETS AGE default 1 28d irsa 1 66m
サービスアカウントがない場合は、「Configure service accounts for pods」(Kubernetes ウェブサイト) を参照してください。
サービスアカウントに正しい IAM ロールアノテーションがあることを確認する
次のコマンドを実行します。
$ kubectl describe sa irsa -n YOUR_NAMESPACE
**注:**irsa はご使用の Kubernetes サービスアカウント名に置き換えてください。YOUR_NAMESPACE を自分の Kubernetes の名前空間に置き換えてください。
次の出力例を参照してください。
Name: irsa Namespace: default Labels: none Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME Image pull secrets: none Mountable secrets: irsa-token-v5rtc Tokens: irsa-token-v5rtc Events: none
ポッドで serviceAccountName が正しく指定されていることを確認する
次のコマンドを実行します。
$ kubectl get pod POD_NAME -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:
**注:**POD_NAME と YOUR_NAMESPACE をお使いの Kubernetes ポッドと名前空間に置き換えてください。
次の出力例を参照してください。
serviceAccountName: irsa
環境変数と許可を確認する
ポッドの環境変数で AWS_ROLE_ARN と AWS_WEB_IDENTITY_TOKEN_FILE を探します。
$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS
次の出力例を参照してください。
AWS_REGION=ap-southeast-2 AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_DEFAULT_REGION=ap-southeast-2
アプリケーションがサポートされている AWS SDK を使用していることを確認する
SDK バージョンは以下の値以上でなければなりません。
Java (Version 2) — 2.10.11 Java — 1.11.704 Go — 1.23.13 Python (Boto3) — 1.9.220 Python (botocore) — 1.12.200 AWS CLI — 1.16.232 Node — 3.15.0 Ruby — 2.11.345 C++ — 1.7.174 .NET — 3.3.659.1 PHP — 3.110.7
サポートされている最新の SDK バージョンを確認するには、「サポートされている AWS SDK の使用」を参照してください。
ポッドのユーザーとグループを確認する
次のコマンドを実行します。
$ kubectl exec -it POD_NAME -- id uid=0(root) gid=0(root) groups=0(root)
**注:**デフォルトでは、Web ID トークンファイルを読み取るための適切なファイルシステム権限を持っているのは root として実行されるコンテナだけです。
コンテナが root として実行されていない場合、次のエラーが表示されることがあります。
Error: PermissionError: [Errno 13] Permission denied: '/var/run/secrets/eks.amazonaws.com/serviceaccount/token
-または-
WebIdentityErr: failed fetching WebIdentity token: \ncaused by: WebIdentityErr: unable to read file at /var/run/secrets/eks.amazonaws.com/serviceaccount/token\ncaused by: open /var/run/secrets/eks.amazonaws.com/serviceaccount/token: permission denied
適切なファイルシステムの許可を提供するには、コンテナが root として実行されていることを確認してください。1.18 以下のクラスターでは、マニフェスト内のコンテナーに次のセキュリティコンテキストを指定します。
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: metadata: labels: app: my-app spec: serviceAccountName: my-app containers: - name: my-app image: my-app:latest securityContext: fsGroup: 1337 ...
**注:**fsGroup ID は任意です。有効なグループ ID はどれでも選択できます。クラスター 1.19 以降では、前述のセキュリティコンテキスト設定は必要ありません。
ポッドを再作成する
IRSA を適用する前にポッドを作成した場合は、Pod を再作成します。
以下のコマンド例をご覧ください。
$ kubectl rollout restart deploy nginx
次の出力例を参照してください。
deployment.apps/nginx restarted
daemonsets または statefulsets デプロイでは、次のコマンドを使用できます。
$ kubectl rollout restart deploy DEPLOYMENT_NAME
ポッドを 1 つしか作成していない場合は、ポッドを削除して再作成する必要があります。
ポッドを削除するには、以下のコマンド例を参照してください。
$ kubectl delete pod POD_NAME
ポッドを再作成するには、以下のコマンド例を参照してください。
$ kubectl apply -f SPEC_FILE
注: SPEC_FILE をお使いの Kubernetes マニフェストファイルのパスとファイル名に置き換えてください。
オーディエンスが正しいことを確認する
オーディエンスが正しくない OIDC プロバイダーを作成した場合は、次のエラーが表示されます。
Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience
クラスターの IAM ID プロバイダーを確認します。ClientIdList は sts.amazonaws.com です。
$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
次の出力例を参照してください。
{ "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E", "ClientIDList": [ "sts.amazonaws.com" ], "ThumbprintList": [ "9e99a48a9960b14926bb7f3b02e22da2b0ab7280" ], "CreateDate": "2021-01-21T04:29:09.788000+00:00", "Tags": [] }
サムプリントが正しいことを確認する
IAM OIDC で設定されているサムプリントが正しくない場合、次のエラーが表示されることがあります。
failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint
正しいサムプリントを自動的に設定するには、 eksctl または AWS マネジメントコンソールを使用して IAM ID プロバイダーを作成します。サムプリントを取得する他の方法については、「OpenID Connect ID プロバイダーのサムプリントの取得」を参照してください。
AWS 中国リージョンの場合は、AWS_DEFAULT_REGION 環境変数を確認する
AWS 中国リージョンのクラスターにデプロイされるポッドまたはデーモンセットに IRSA を使用する場合は、ポッド仕様で AWS_DEFAULT_REGION 環境変数を設定します。そうしないと、Pod または daemonset に次のエラーが表示されることがあります。
An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid
次の例を使用して、AWS_DEFAULT_REGION 環境変数をポッドまたは daemonset の仕様に追加します。
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: metadata: labels: app: my-app spec: serviceAccountName: my-app containers: - name: my-app image: my-app:latest env: - name: AWS_DEFAULT_REGION value: "AWS_REGION" ...
関連するコンテンツ
- 質問済み 3年前lg...
- 質問済み 3ヶ月前lg...
- 質問済み 4年前lg...
- 質問済み 2ヶ月前lg...
- 質問済み 5年前lg...
- AWS公式更新しました 4ヶ月前