Global outage event
If you're experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
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 のバージョンを使用してください。
関連情報
- トピック
- Containers
- 言語
- 日本語
