Amazon EKS の AWS SDK ワークロードに関する一般的な問題をトラブルシューティングする方法を教えてください。

所要時間3分
0

AWS SDK を使用して Amazon Elastic Kubernetes Service (Amazon EKS) 用のコンテナアプリケーションを開発しました。AWS サービスを呼び出そうとすると、エラーが表示されます。

解決方法

AWS SDK を使用するコンテナアプリケーションを Amazon EKS クラスターにデプロイすると、次のいずれかのエラーが表示されることがあります。

  • NoCredentialsError: 認証情報が見つからない
  • EndpointConnectionError
  • ClientError: エラーが発生しました (AccessDenied)
  • ClientError: エラーが発生しました (UnauthorizedOperation)

具体的なエラーメッセージは、アプリケーションが使用する AWS SDK プログラミング言語によって異なります。エラーについては、次のトラブルシューティング手順を参照してください。

認証情報が見つからない

Amazon EKS がポッドの認証情報を見つけられない場合は、次のメッセージのようなエラーが表示されます。

「File "/usr/local/lib/python2.7/site-packages/botocore/auth.py", line 315, in add_auth
raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials」

このエラーは、ポッドの認証情報を設定していない場合、認証情報を正しく設定していない場合、または AWS SDK のバージョンがサポートされていない場合に発生します。

このエラーを解決するには、AWS Identity and Access Management (IAM) ロールを使用してください。通常は、アプリケーションまたは Amazon EC2 インスタンスのロールを使用して、SDK クライアントの AWS 認証情報を作成して配布します。そうではなく、サービスアカウントに IAM ロールを使用するようにポッドを設定します。IAM ロールを Kubernetes サービスアカウントに関連付けて、そのサービスアカウントを使用するようにポッドを設定します。

重要: ポッドのコンテナは、OpenID Connect ウェブ ID トークンファイルによる IAM ロールの引き継ぎをサポートする AWS SDK バージョンを使用する必要があります。

エンドポイント URL に接続できない

ポッドが AWS サービスエンドポイントと通信できない場合、次のメッセージのようなエラーが表示されます。

「File "/usr/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 359, in _check_caught_exception
raise caught_exception
botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: "https://ec2.eu-west-1.amazonaws.com/"
botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: "https://sts.eu-west-1.amazonaws.com/"」

このエラーを解決するには、DNS の問題をトラブルシューティングし、次の点を確認してください。

**CoreDNS ポッドがクラスターで実行されているか確認する **

以下のコマンドを実行します。

kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o wide

次の例のような出力が表示されます。

NAME                       READY   STATUS    RESTARTS   AGE   IP                NODE                                            NOMINATED NODE   READINESS GATES  
coredns-7f85bf9964-kz8lp   1/1     Running   0          15d   192.168.100.36    ip-192-168-101-156.eu-west-1.compute.internal   <none>           <none>  
coredns-7f85bf9964-wjxvb   1/1     Running   0          15d   192.168.135.215   ip-192-168-143-137.eu-west-1.compute.internal   <none>           <none>

CoreDNS ポッドを正常に実行するには、Amazon EKS クラスターに十分な容量のある実行中のワーカーノードがあることを確認してください。

テストエンドポイントを解決する

CoreDNS ポッドとアプリケーションポッドが、ポッドで呼び出す AWS サービスエンドポイントを解決できることを確認します。以下のコマンドを実行します。

nslookup SERVICE_ENDPOINT  

nslookup ec2.eu-west-1.amazonaws.com  

nslookup ec2.amazonaws.com

注: SERVICE_ENDPOINT をエラーメッセージに表示されているエンドポイントに置き換えてください。

AssumeRoleWithWebIdentity 操作を呼び出すときエラー (AccessDenied) が発生しました

ポッドが一時的なセキュリティ認証情報をリクエストできない場合は、次のメッセージのようなエラーが表示されます。

「File "/usr/local/lib/python3.11/site-packages/botocore/client.py", line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity」

このエラーを解決するには、次の手順を実行してください。

**引き受ける IAM ロールを確認する **

ポッドが、クラスターに存在する Kubernetes サービスアカウントに関連付けられた IAM ロールを引き継いでいることを確認します。それ以外の場合、ポッドは Amazon EKS ノードの IAM ロールを引き継ぎます。サービスアカウントの IAM ロール ARN を取得するには、次のコマンドを実行します。

kubectl get serviceaccount -A  

kubectl describe serviceaccount serviceaccount_name -n namespace_name | grep -i arn

注: serviceaccount_namenamespace_name を独自の値に置き換えてください。

次の例のような出力が表示されます。

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::11112222333:role/AccessEC2role

CloudTrail のイベントをチェックする

どの IAM ID がアクセスを拒否されているかを確認して、AssumeRoleWithWebIdentity actionView を実行してください。これを行うには、CloudTrail コンソールで AWS CloudTrail イベントを確認します。

  1. CloudTrail コンソールにログインします。
  2. ナビゲーションペインで、[イベント履歴] を選択します。
  3. [検索属性] ドロップダウンメニューで、選択内容を [読み取り専用] から [イベント名] に変更します。
  4. [イベント名を入力] 検索バーに「AssumeRoleWithWebIdentity」と入力します。コンテンツペインに表示されるイベントのリストを確認します。拒否されたイベントの次の例を参照してください。
{  
    "eventVersion": "1.08",  
    "userIdentity": {  
        "type": "WebIdentityUser",  
        "userName": "system:serviceaccount:serverless:aws-sdk"  
    },  
    "eventName": "AssumeRoleWithWebIdentity",  
    "errorCode": "AccessDenied",  
    "errorMessage": "An unknown error occurred",  
    "requestParameters": {  
        "roleArn": "arn:aws:iam::11112222333:role/AccessEC2role",  
        "roleSessionName": "botocore-session-1675698641"  
    }  
}

この出力では、roleArn はポッドのサービスアカウントに設定した IAM ロールと同じ IAM ロールでなければなりません。
userName (system:serviceaccount:serverless:aws-sdk) は、サービスアカウント名とその名前空間に一致する必要があります。この名前の形式は、system:serviceaccount:namespace:serviceaccount_name です。

ポッドのサービスアカウント IAM ロールを設定する

IAM コンソールで、適切な IAM 信頼ポリシーステートメントを使用してポッドのサービスアカウント IAM ロールを設定します。

     {  
            "Effect": "Allow",  
            "Principal": {  
                "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD"  
            },  
            "Action": "sts:AssumeRoleWithWebIdentity",  
            "Condition": {  
                "StringEquals": {  
                    "oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD:sub": "system:serviceaccount:namespace_name:serviceaccount_name",  
                    "oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD:aud": "sts.amazonaws.com"  
                }  
            }  
    }     

注: region_codeACCOUNT_IDEXAMPLE11111122222333334444ABCDserviceaccount_name および namespace_name を独自の値に置き換えてください。

エラーが発生しました (UnauthorizedOperation)

ポッドのサービスアカウントに設定した IAM ロールには、他の AWS サービスを呼び出す権限がない場合があります。この場合、次のメッセージのようなエラーが表示されます。

File "/usr/local/lib/python3.11/site-packages/botocore/client.py", line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: DescribeInstances オペレーションを呼び出したときに、エラー (UnauthorizedOperation) が発生しました: この操作を実行する権限がありません。

このエラーを解決するには、次の手順を実行してください。

  1. ポッドが Kubernetes サービスアカウントに関連付けられた IAM ロールを引き継いでいることを確認します。そのためには、前のセクションの「引き受ける IAM ロールを確認する」を参照してください。このステップが返すロールの ARN を書き留めます。
  2. IAM コンソールを開きます。ナビゲーションペインで、[ロール] を選択します。次に、ステップ 1 でロール ARN を検索して選択します。
  3. [権限] タブで、必要な IAM ポリシー権限を IAM ロールにアタッチします。

ポッドの例については、GitHub の「認証情報プロバイダーとしてウェブフェデレーション ID プロバイダーを使用して AWS Python SDK を実行するサンプルポッド」を参照してください。

AWS公式
AWS公式更新しました 1年前
コメントはありません