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

最終更新日: 2021 年 11 月 15 日

このポッドでは、Amazon Elastic Kubernetes Service (Amazon EKS) アカウントトークンで 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

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 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 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

サービスアカウントがない場合は、「Pod のサービスアカウントを構成する」を参照してください

サービスアカウントに正しい 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_IAM_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

daemonset または statefulsets デプロイメントでは、次のコマンドを使用できます。

$ kubectl rollout restart deploy DEPLOYMENT_NAME

Pod を 1 つしか作成していない場合は、Pod を削除して再作成する必要があります。

削除するコマンドの例:

$ 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

クラスターの OIDC 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 環境変数をポッドまたはデーモンセットの仕様に追加します。

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"
...

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?