Amazon EKS の IRSA エラーのトラブルシューティング方法を教えてください。
最終更新日: 2021 年 12 月 10 日
Amazon Elastic Kubernetes サービス (Amazon EKS) でサービスアカウント (IRSA) の IAM ロールを使用すると、エラーが発生することがよくあります。
簡単な説明
Amazon EKS の IRSA に関する問題のトラブルシューティングを行うには、以下のセクションのいずれかの手順を完了します。
- IAM ARN のフォーマットを確認する
- お使いの AWS アカウントに IAM OIDC プロバイダーがあるかどうかを確認する
- OIDC プロバイダーの対象者を確認する
- ルート証明書サムプリントを使用して OIDC リソースを作成したことを確認します。
- IAM ロールの信頼ポリシーの設定を確認する
- ポッド ID Webhook 設定が存在し、有効であることを確認します。
- サポートされている AWS SDK を使用していることを確認する
解決方法
IAM ARN のフォーマットを確認する
IAM Amazon リソースネーム (ARN) が相対サービスアカウントアノテーションに設定され、正しくフォーマットされていない場合、次のエラーが表示されます。
An error occurred (ValidationError) when calling the AssumeRoleWithWebIdentity
operation: Request ARN is invalid
不正な ARN 形式の例:
eks.amazonaws.com/role-arn: arn:aws:iam::::1234567890:role/example
上記の ARN 形式は余分なコロン (:) が含まれているため正しくありません。正しい ARN 形式を使用していることを確認するには、IAM ARNを参照してください。
お使いの AWS アカウントに IAM OIDC プロバイダーがあるかどうかを確認する
OpenID Connect (OIDC) プロバイダーを作成していない場合は、次のエラーが表示されます。
An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: No OpenIDConnect provider found in your account for https://oidc.eks.region.amazonaws.com/id/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IAM 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
IAM OIDC プロバイダーを一覧表示します。
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
注:EXAMPLED539D4633E53DE1B716D3041E は、前のコマンドが返した値に置き換えてください。
OIDC プロバイダーが存在しない場合は、次の eksctl コマンドを使用してプロバイダーを作成します。
eksctl utils associate-iam-oidc-provider --cluster cluster name --approve
注: クラスター名 をご自分のクラスター名に置き換えてください。
AWS マネジメントコンソールを使用して、クラスターの IAM OIDC プロバイダーを作成することもできます。
IAM OIDC プロバイダーのオーディエンスを確認する
IAM OIDC プロバイダーを作成するときは、 sts.amazonaws.com をオーディエンスとして使用する必要があります。オーディエンスが正しくない場合は、次のエラーが表示されます。
An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience
IAM OIDC プロバイダーのオーディエンスを確認します。
aws iam get-open-id-connect-provider --open-id-connect-provider-arn ARN-of-OIDC-provider
注:OIDC プロバイダーの ARN を OIDC プロバイダーの ARN に置き換えます。
- または -
以下の手順を実行します。
1. Amazon EKS コンソールを開いてください。
2. クラスター名を選択して、 設定タブを選択します。
3. [詳細] セクションで、OpenID Connect プロバイダ URL の値を書き留めてください。
4. IAM コンソールを開きます。
5. ナビゲーションペインの [アクセス管理] で、[ID プロバイダ] を選択します。
6. クラスターの URL に一致するプロバイダーを選択します。
対象ユーザーを変更するには、次の手順に従います。
1. IAM コンソールを開きます。
2. ナビゲーションペインの [アクセス管理] で、[ID プロバイダ] を選択します。
3. クラスターの URL に一致するプロバイダーを選択します。
4. Actionsを選択してから、[観客を増加する]を選択してくさい。
5. sts.amazonaws.com を追加します。
ルート証明書のサムプリントで IAM OIDC リソースを作成したことを確認します。
OIDC プロバイダーを作成するためにルート証明書サムプリントを使用しなかった場合、次のエラーが表示されます。
An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint
注:ルート以外の証明書のサムプリントは毎年更新され、ルート証明書のサムプリントは 10 年ごとに更新されます。したがって、IAM OIDC を作成するときは、ルート証明書のサムプリントを使用するのがベストプラクティスです。
AWS コマンドラインインターフェイス (AWS CLI)、AWS Tools for PowerShell、または IAM API を使用して IAM OIDC を作成した場合は、サムプリントを手動で取得する必要があります。IAM コンソールで IAM OIDC を作成した場合、サムプリントを手動で取得して、コンソールが正しいサムプリントを取得したことを確認するのがベストプラクティスです。
ルート証明書のサムプリントと有効期限を取得します。
echo | openssl s_client -servername oidc.eks.your-region-code.amazonaws.com -showcerts -connect oidc.eks.your-region-code.amazonaws.com:443 2>&- | tail -r | sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | tail -r | openssl x509 -fingerprint -noout -dates | sed 's/://g' | awk -F= '{print tolower($2)}'
注:your-region-code は、クラスターが配置されている AWS リージョンに置き換えます。
出力例:
9e99a48a9960b14926bb7f3b02e22da2b0ab7280 sep 2 000000 2009 gmt jun 28 173916 2034 gmt
上記の出力例では、 9e99a48a9960b14926bb7f3b02e22da2b0ab7280 がサムプリント、 2009 年 9 月 2 日 000000 GMT が証明書の開始日、 173916 2034 年 6 月 28 日が証明書の有効期限です。
IAM ロールの信頼ポリシーの設定を確認する
IAM ロールの信頼ポリシーが正しく設定されていない場合、次のエラーが表示されます。
An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity
この問題を解決するには、正しい IAM OIDC プロバイダーを使用していることを確認してください。IAM OIDC プロバイダーが正しい場合は、 IAM ロール設定ガイドを使用して、信頼ポリシーの条件が正しく設定されているかどうかを確認します。
ポッド ID Webhook 設定が存在し、有効であることを確認します。
Webhook 設定を誤って削除または変更した場合、IRSA は動作を停止します。
以下のコマンドを実行して、Webhook 設定が存在し、有効であることを確認します。
kubectl get mutatingwebhookconfiguration pod-identity-webhook -o yaml
サポートされている AWS SDK を使用していることを確認する
OIDC ウェブ ID トークンファイルによる IAM ロールの引き受けをサポートする AWS SDK バージョンを使用していることを確認します。