Wie behebe ich häufig auftretende Probleme mit AWS-SDK-Workloads in Amazon EKS?

Lesedauer: 5 Minute
0

Ich habe das AWS SDK verwendet, um eine Container-Anwendung für Amazon Elastic Kubernetes Service (Amazon EKS) zu entwickeln. Wenn ich versuche, AWS-Services anzurufen, erhalte ich eine Fehlermeldung.

Lösung

Wenn Sie eine Container-Anwendung, die das AWS-SDK verwendet, in einem Amazon EKS-Cluster bereitstellen, wird möglicherweise einer der folgenden Fehler angezeigt:

  • NoCredentialsError: Anmeldeinformationen konnten nicht gefunden werden
  • EndpointConnectionError
  • ClientError: Ein Fehler ist aufgetreten (AccessDenied)
  • ClientError: Ein Fehler ist aufgetreten (UnauthorizedOperation)

Die spezifische Fehlermeldung hängt von der AWS-SDK-Programmiersprache ab, die Ihre Anwendung verwendet. Befolgen Sie die folgenden Schritte zur Fehlerbehebung für Ihren Fehler.

Anmeldeinformationen konnten nicht gefunden werden

Wenn Amazon EKS die Anmeldeinformationen Ihres Pods nicht finden kann, wird ein Fehler angezeigt, der der folgenden Meldung ähnelt:

„Datei „/usr/local/lib/python2.7/site-packages/botocore/auth.py", Zeile 315, in add_auth
raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Anmeldeinformationen konnten nicht gefunden werden“

Dieser Fehler tritt auf, wenn Sie die Anmeldeinformationen Ihres Pods nicht konfigurieren, diese nicht korrekt konfigurieren oder Ihre AWS-SDK-Version nicht unterstützt wird.

Verwenden Sie AWS Identity and Access Management (IAM)-Rollen, um diesen Fehler zu beheben. In der Regel erstellen und verteilen Sie AWS-Anmeldeinformationen für den SDK-Client in der Anwendung oder mit der Amazon EC2-Instance-Rolle. Konfigurieren Sie Ihre Pods stattdessen so, dass sie IAM-Rollen für Dienstkonten verwenden. Ordnen Sie eine IAM-Rolle einem Kubernetes-Dienstkonto zu und konfigurieren Sie dann Ihre Pods für die Verwendung des Dienstkontos.

Wichtig: Die Container Ihrer Pods müssen eine AWS-SDK-Version verwenden, die die Übernahme einer IAM-Rolle über eine OpenID Connect-Webidentitäts-Tokendatei unterstützt.

Es konnte keine Verbindung zur Endpunkt-URL hergestellt werden

Wenn Ihr Pod nicht mit den AWS-Serviceendpunkten kommunizieren kann, wird ein Fehler angezeigt, der der folgenden Meldung ähnelt:

„Datei „/usr/local/lib/python2.7/site-packages/botocore/retryhandler.py“, Zeile 359, in _check_caught_exception
raise caught_exception
botocore.exceptions.EndpointConnectionError: Es konnte keine Verbindung zur Endpunkt-URL hergestellt werden: „https://ec2.eu-west-1.amazonaws.com/“
botocore.exceptions.EndpointConnectionError: Es konnte keine Verbindung zur Endpunkt-URL hergestellt werden: „https://sts.eu-west-1.amazonaws.com/““

Um diesen Fehler zu beheben, beheben Sie DNS-Probleme und überprüfen Sie die folgenden Punkte:

Überprüfen, ob CoreDNS-Pods im Cluster laufen

Führen Sie den folgenden Befehl aus:

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

Sie erhalten eine Ausgabe, die dem folgenden Beispiel ähnelt:

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>

Stellen Sie sicher, dass im Amazon EKS-Cluster Worker-Knoten mit ausreichender Kapazität laufen, um die CoreDNS-Pods erfolgreich ausführen zu können.

Testen der Endpunkt-Auflösung

Stellen Sie sicher, dass Ihr CoreDNS-Pod und Ihr Anwendungs-Pod den AWS-Serviceendpunkt auflösen können, den Ihr Pod aufrufen soll. Führen Sie den folgenden Befehl aus:

nslookup SERVICE_ENDPOINT  

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

nslookup ec2.amazonaws.com

Hinweis: Ersetzen Sie SERVICE_ENDPOINT durch den ENDPUNKT, der in der Fehlermeldung angegeben ist.

Beim Aufrufen der AssumeRoleWithWebIdentity-Operation ist ein Fehler aufgetreten (AccessDenied)

Wenn Ihr Pod keine temporären Sicherheitsanmeldeinformationen anfordern kann, wird eine Fehlermeldung angezeigt, die der folgenden Meldung ähnelt:

„Datei „/usr/local/lib/python3.11/site-packages/botocore/client.py“, Zeile 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Beim Aufrufen der AssumeRoleWithWebIdentity-Operation ist ein Fehler aufgetreten (AccessDenied): Nicht zur Ausführung von sts:AssumeRoleWithWebIdentity autorisiert“

Gehen Sie wie folgt vor, um diesen Fehler zu beheben:

Die angenommene IAM-Rolle bestätigen

Vergewissern Sie sich, dass der Pod eine IAM-Rolle annimmt, die mit einem Kubernetes-Dienstkonto verknüpft ist, das im Cluster vorhanden ist. Andernfalls übernimmt der Pod die IAM-Rolle des Amazon EKS-Knotens. Führen Sie den folgenden Befehl aus, um den IAM-Rollen-ARN des Dienstkontos abzurufen:

kubectl get serviceaccount -A  

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

Hinweis: Ersetzen Sie serviceaccount_name und namespace_name durch Ihre eigenen Werte.

Sie erhalten eine Ausgabe, die dem folgenden Beispiel ähnelt:

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

Überprüfen der CloudTrail-Ereignisse

Überprüfen Sie, welcher IAM-Identität der Zugriff verweigert wurde, um die AssumeRoleWithWebIdentity actionView auszuführen. Überprüfen Sie hierzu die AWS CloudTrail-Ereignisse in der CloudTrail-Konsole.

  1. Melden Sie sich bei der CloudTrail-Konsole an.
  2. Wählen Sie im Navigationsbereich die Option Ereignisverlauf aus.
  3. Ändern Sie im Dropdownmenü Suchattribute die Auswahl von Schreibgeschützt zu Ereignisname.
  4. Geben Sie in der Suchleiste Einen Ereignisnamen eingeben den Wert AssumeRoleWithWebIdentity ein. Prüfen Sie die Liste der Ereignisse, die im Inhaltsbereich angezeigt wird. Sehen Sie sich das folgende Beispiel für ein abgelehntes Ereignis an:
{  
    "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"  
    }  
}

In dieser Ausgabe muss roleArn dieselbe IAM-Rolle sein, die Sie für das Dienstkonto des Pods konfiguriert haben.
Der userName (system:serviceaccount:serverless:aws-sdk) muss mit dem Namen des Dienstkontos und seinem Namespace übereinstimmen. Das Format für diesen Namen ist system:serviceaccount:namespace:serviceaccount_name.

Die IAM-Rolle des Pods für das Dienstkonto konfigurieren

Konfigurieren Sie in der IAM-Konsole die IAM-Rolle des Pods für das Dienstkonto mit der richtigen IAM-Vertrauensrichtlinie:

     {  
            "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"  
                }  
            }  
    }     

Hinweis: Ersetzen Sie region_code, ACCOUNT_ID, EXAMPLE11111122222333334444ABCD, serviceaccount_name und namespace_name durch Ihre eigenen Werte.

Ein Fehler ist aufgetreten (UnauthorizedOperation)

Die IAM-Rolle, die Sie für das Servicekonto des Pods konfiguriert haben, ist möglicherweise nicht autorisiert, andere AWS-Services aufzurufen. In diesem Fall wird ein Fehler angezeigt, der der folgenden Meldung ähnelt:

Datei „/usr/local/lib/python3.11/site-packages/botocore/client.py“, Zeile 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Beim Aufrufen der DescribeInstances-Operation ist ein Fehler aufgetreten (UnauthorizedOperation): Sie sind nicht berechtigt, diesen Vorgang durchzuführen.

Gehen Sie wie folgt vor, um diesen Fehler zu beheben:

  1. Vergewissern Sie sich, dass der Pod eine IAM-Rolle annimmt, die mit einem Kubernetes-Dienstkonto verknüpft ist. Informationen dazu finden Sie im vorherigen Abschnitt Die angenommene IAM-Rolle bestätigen. Notieren Sie sich den Rollen-ARN, den dieser Schritt zurückgibt.
  2. Öffnen Sie die IAM-Konsole. Wählen Sie im Navigationsbereich Rollen aus. Suchen Sie dann nach dem Rolle-ARN aus Schritt 1 und wählen Sie ihn aus.
  3. Ordnen Sie der IAM-Rolle auf der Registerkarte Berechtigungen die erforderlichen IAM-Richtlinienberechtigungen zu.

Einen Beispiel-Pod finden Sie auf GitHub unter Beispiel-Pod, auf dem das AWS Python-SDK mit einem Web-Verbunds-Identitätsanbieter als Anmeldeinformations-Anbieter ausgeführt wird.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr