Amazon EKS で IRSA のエラーをトラブルシューティングする方法を教えてください。

所要時間3分
0

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 コンソールを使用してオーディエンスを確認するには、次の手順を実行します:

  1. Amazon EKS コンソールを開きます。
  2. クラスターの名前を選択し、[概要] タブを選択します。
  3. [詳細] セクションで、OIDC プロバイダーの URL の値を書き留めておきます。
  4. IAM コンソールを開きます。
  5. ナビゲーションペインの [アクセス管理] で、[ID プロバイダー] を選択します。
  6. クラスターの URL と一致するプロバイダーを選択します。

対象者を変更するには、次の手順を実行します:

  1. IAM コンソールを開きます。
  2. ナビゲーションペインの [アクセス管理] で、[ID プロバイダー] を選択します。
  3. クラスターの URL と一致するプロバイダーを選択します。
  4. [アクション] を選択し、[対象者を追加] を選択します。
  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 を作成する際は、ルート証明書のサムプリントを使用することをします。

例えば、以下のサービスのいずれかを使用して 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 のバージョンを使用してください。

関連情報

Amazon EKS ポッドでサービスアカウントの IAM ロールを使用できないのはなぜですか?

Amazon EKS で OIDC プロバイダーと IRSA をトラブルシューティングするにはどうすればよいですか?

AWS公式
AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ