Amazon EKS で IRSA のエラーをトラブルシューティングする方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) で サービスアカウントの AWS Identity and Access Management (IAM) ロール (IRSA) を使用すると、エラーが発生します。
解決策
IAM ARN のフォーマットをチェックする
サービスアカウントのアノテーションに誤った形式で IAM 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 の形式が正しくないとエラーメッセージが表示されます。正しい 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 は、IAM OIDC プロバイダー URL に置き換えてください。
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
注: ARN-of-OIDC-provider は、OIDC プロバイダーの ARN に置き換えてください。
**ClientIDList ** パラメータでは、出力に sts.amazonaws.com と表示されている必要があります。Amazon EKS コンソールを使用してオーディエンスを確認するには、次の手順を実行します:
- Amazon EKS コンソールを開きます。
- クラスターの名前を選択し、[概要] タブを選択します。
- [詳細] セクションで、OIDC プロバイダーの URL の値を書き留めておきます。
- IAM コンソールを開きます。
- ナビゲーションペインの [アクセス管理] で、[ID プロバイダー] を選択します。
- クラスターの URL と一致するプロバイダーを選択します。
対象者を変更するには、次の手順を実行します:
- IAM コンソールを開きます。
- ナビゲーションペインの [アクセス管理] で、[ID プロバイダー] を選択します。
- クラスターの URL と一致するプロバイダーを選択します。
- [アクション] を選択し、[対象者を追加] を選択します。
- 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 を作成する際は、ルート証明書のサムプリントを使用することをします。
例えば、以下のサービスのいずれかを使用して IAM OIDC を作成するとします。
- AWS コマンドラインインターフェイス (AWS CLI)
- AWS Tools for PowerShell
- IAM API
この場合、手動でサムプリントを取得する必要があります。IAM コンソールで IAM OIDC を作成した場合は、サムプリントを手動で取得することをお勧めします。このサムプリントを使用して、コンソールが正しい 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>/dev/null | awk '/-----BEGIN CERTIFICATE-----/{cert=""} {cert=cert $0 "\n"} /-----END CERTIFICATE-----/{last_cert=cert} END{printf "%s", last_cert}' | 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 がサムプリント、sep 2 000000 2009 gmt が証明書の開始日、jun 28 173916 2034 が証明書の有効期限です。
IAM ロールの信頼ポリシーの設定を確認する
IAM ロールの信頼ポリシーの設定に誤りがあると、次のエラーが表示されます::
「An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity」
この問題を解決するには、正しい IAM OIDC プロバイダーを使用していることを確認してください。IAM OIDC プロバイダーが正しい場合は、 IAMロールをチェックして、信頼ポリシーの条件が正しく設定されているかどうかを確認します。
Pod Identity Webhook の設定が存在し、有効であることを確認する
Pod Identity Webhook は、必要な環境変数と投影ボリュームを挿入します。Webhook の設定を誤って削除または変更した場合、IRSA は動作を停止します。
Webhook の設定が存在し、有効であることを確認するには、次のコマンドを実行します。
kubectl get mutatingwebhookconfiguration pod-identity-webhook -o yaml
pod-identity-webhook 設定が存在しない場合は、以下のコマンドを実行して作成します。
CLUSTER_CA=$(aws eks describe-cluster --name CLUSTER_NAME --region REGION_CODE --query 'cluster.certificateAuthority.data' --output text); cat << EOF | kubectl apply -f - apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: pod-identity-webhook webhooks: - name: iam-for-pods.amazonaws.com clientConfig: url: "https://127.0.0.1:23443/mutate" caBundle: $CLUSTER_CA failurePolicy: Ignore rules: - operations: [ "CREATE" ] apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] scope: "*" reinvocationPolicy: IfNeeded sideEffects: None admissionReviewVersions: ["v1beta1"] EOF
**注:**CLUSTER_NAME はご使用のクラスター名に、REGION_CODE はクラスターリージョンに置き換えてください。
Pod Identity Webhook が、IRSA を使用するポッドに環境変数を挿入していることを確認する
Pod Identity Webhookが、IRSA を使用するポッドに環境変数を挿入していることを確認するには、以下のコマンドのいずれかを実行します。
kubectl get pod <pod-name> -n <ns> -o yaml | grep aws-iam-token
または、
kubectl get pod <pod-name> -n <ns> -o yaml | grep AWS_WEB_IDENTITY_TOKEN_FILE
サポートされている AWS SDK を使用していること確認する
お使いの AWS SDK を確認します。必ず、OIDC ウェブ ID トークンファイルで IAM ロールを引き受けることができる AWS SDK のバージョンを使用してください。
関連情報
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 5年前lg...
- 質問済み 6年前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前