Amazon EKS ポッドでサービスアカウントの IAM ロールを使用できないのはなぜですか?
サービスアカウントに AWS ID およびアクセス管理 (IAM) ロールを使用しようとしています。私の Amazon Elastic Kubernetes サービス (Amazon EKS) ポッドは、割り当てられた IAM ロールを引き継ぐことができず、認証エラーが発生します。または、ポッドは、ポッドに割り当てられた IAM ロールの代わりに Amazon EKS ノードに割り当てられたデフォルトの IAM ロールを使用しようとします。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用しているようにしてください。
Amazon EKS クラスター用の IAM OIDC アイデンティティプロバイダーがあることを確認する
クラスター用の IAM OIDC プロバイダーを作成します (まだ作成していない場合)。サービスアカウントに IAM ロールを使用するには、クラスターの OIDC ID プロバイダーが必要です。
次に、OIDC ID プロバイダーが正しく設定されていることを確認します。
- IAM コンソールを開きます。ナビゲーションペインから [ID プロバイダー] を選択します。
- [プロバイダー] 列で、OIDC プロバイダー URL を特定して書き留めます。
- 別のタブまたはウィンドウで、Amazon EKS コンソールを開きます。次に、ナビゲーションペインから [クラスター] を選択します。
- クラスターを選択し、[構成] タブを選択します。
- [詳細] セクションで、OpenID Connect プロバイダーの URL の値を書き留めておきます。
- Amazon EKS コンソール (ステップ 5) の OIDC プロバイダーの URL が IAM コンソール (ステップ 2) の OIDC プロバイダーの URL と一致することを確認します。
Amazon EKS クラスターの OIDC プロバイダーの URL が IAM コンソールの OIDC プロバイダーの URL のいずれとも一致しない場合は、新しい IAM OIDC プロバイダーを作成する必要があります。
IAM ロールポリシーと信頼ポリシー設定を検証する
お使いの IAM ロールには、必要なすべての権限がない場合があります。AWS マネジメントコンソールまたは AWS CLI で IAM ロールを作成した場合、IAM ロールの信頼関係ポリシーにも構文エラーがある可能性があります。
IAM ロールポリシーを検証し、信頼ポリシーに構文エラーがないかどうかを確認するには、以下を実行してください。
- IAM コンソールを開きます。
- ナビゲーションペインで [ロール] を選択し、ロールを選択します。
- ロールのページで [権限] タブを選択し、必要な権限がすべてロールに割り当てられていることを確認します。
- [信頼関係] タブを選択し、[信頼関係の編集] を選択します。
- 信頼関係のポリシードキュメントで、ポリシーの形式が次の JSON ポリシーの形式と一致していることを確認します。
JSON ポリシーで、[Federated] プロパティ行と [StringEquals] プロパティ行の形式を確認します。[Federated] 行で、AWS リージョンコード (your-region-code)、アカウント ID (your-account-id)、一意の OIDC 識別子 (EXAMPLE_OIDC_IDENTIFIER) の形式が正しいことを確認します。**StringEquals ** 行で、リージョンコード (your-region-code)、OIDC 固有識別子 (EXAMPLE_OIDC_IDENTIFIER)、Kubernetes 名前空間 (your-namespace)、および Kubernetes サービスアカウント名 (your-namespace) の形式が正しいことを確認します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::your-account-id:oidc-provider/oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:sub": "system:serviceaccount:your-namespace:your-service-account", "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com" } } } ] }
- ポリシードキュメントを編集して、形式のエラーを修正する場合は、[信頼ポリシーの更新] を選択します。
サービスアカウントが存在し、IAM ロールの ARN の注釈の形式が正しいことを確認します。
-
Kubernetes サービスアカウントが存在することを確認します。
$ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
注: YOUR_ACCOUNT_NAME をアカウント名に置き換えてください。YOUR_NAMESPACE を自分の名前空間に置き換えます。
上記のコマンドでサービスアカウント名が返されない場合は、サービスアカウントを作成します。詳細については、Kubernetes ウェブサイトの「複数のサービスアカウントを使用する」を参照してください。 -
サービスアカウントの名前が期待どおりであることを確認します。また、role-arn アノテーションの形式が正しいことも確認してください。例:
apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/my-example-iam-role name: my-example-serviceaccount namespace: my-test-namespace
テストポッドを使用して、サービスアカウントが機能することを確認する
テストポッドを実行して、サービスアカウントが正しく機能することを確認します。次に、ポッドが環境変数を正しくマウントでき、指定された IAM ロールを引き受けることができるかどうかを確認します。
-
awscli-pod.yaml というローカルの YAML ファイルを作成します。例:
apiVersion: v1 kind: Pod metadata: name: awscli labels: app: awscli spec: serviceAccountName: YOUR_SERVICE_ACCOUNT containers: - image: amazon/aws-cli command: - "sleep" - "604800" imagePullPolicy: IfNotPresent name: awscli restartPolicy: Always
注: YOUR_SERVICE_ACCOUNT を Kubernetes サービスのアカウント名に置き換えます。
-
名前空間にテストポッドを (YAML ファイルから) 作成します。
$ kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE
注: [YOUR_NAMESPACE] を自分の名前空間に置き換えます。
-
**awscli ** ポッドに正しい environment variables があることを確認します。
$ kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS
出力は次のようになります。
AWS_ROLE_ARN=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
-
テストポッドに正しい IAM ロールが割り当てられていることを確認します。
$ kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity
出力は次のようになります。
{ "UserId": "REDACTEDY471234567890:botocore-session-1632772568", "Account": "012345678912", "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568" }
この出力で受け取る IAM ロール名を含む Arn 値を書き留めておきます。
-
IAM ロールを確認したら、awscli ポッドを削除します。
$ kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE
awscli ポッドに正しい IAM ロールが表示されていれば、サービスアカウントの IAM ロール機能は正しく機能します。
前述の手順で、IAM トークンがポッドに正しくマウントされていることを確認できます。それでもアプリケーションがトークンファイルを正しく使用できない場合は、アプリケーションレベルまたは SDK レベルで問題がある可能性があります。この問題は、アプリケーションが AWS 認証情報を取り込む方法に関連しているか、SDK バージョンがサポートされていないことが原因である可能性があります。詳細については、「デフォルトの認証情報プロバイダーチェーンの使用」、Boto3 ウェブサイトの「認証情報」、および「サポートされている AWS SDK の使用」を参照してください。

関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 2年前lg...
- 質問済み 3ヶ月前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 9ヶ月前
- AWS公式更新しました 2年前
- AWS公式更新しました 7ヶ月前