Warum kann ich keine IAM-Rolle für das Servicekonto in meinem Amazon EKS-Pod verwenden?

Lesedauer: 5 Minute
0

Ich versuche, eine AWS Identity and Access Management (IAM) -Rolle für ein Servicekonto zu verwenden. Mein Amazon Elastic Kubernetes Service (Amazon EKS) -Pod kann die zugewiesene IAM-Rolle aufgrund eines Autorisierungsfehlers nicht annehmen. Oder mein Pod versucht, die dem Amazon EKS-Knoten zugewiesene Standard-IAM-Rolle anstelle der meinem Pod zugewiesenen IAM-Rolle zu verwenden.

Lösung

Hinweis: Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, finden Sie weitere Informationen unter Problembehebung bei AWS CLI-Fehlern. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.

Stellen Sie sicher, dass Sie einen IAM-OIDC-Identitätsanbieter für Ihren Amazon EKS-Cluster haben

Erstellen Sie einen IAM-OIDC-Anbieter für Ihren Cluster, falls Sie noch keinen haben. Sie benötigen einen OIDC-Identitätsanbieter für Ihren Cluster, um eine IAM-Rolle für Ihr Servicekonto verwenden zu können.

Stellen Sie dann sicher, dass der OIDC-Identitätsanbieter richtig konfiguriert ist:

  1. Öffnen Sie die IAM-Konsole. Wählen Sie im Navigationsbereich Identitätsanbieter aus.
  2. Identifizieren und notieren Sie in der Spalte Anbieter die OIDC-Anbieter-URL.
  3. Öffnen Sie in einem separaten Tab oder Fenster die Amazon EKS-Konsole. Wählen Sie dann im Navigationsbereich Cluster aus.
  4. Wählen Sie Ihren Cluster aus und wählen Sie dann die Registerkarte Konfiguration.
  5. Notieren Sie sich im Abschnitt Details den Wert der OpenID Connect-Provider-URL-Eigenschaft.
  6. Stellen Sie sicher, dass die OIDC-Anbieter-URL aus der Amazon EKS-Konsole (Schritt 5) mit der OIDC-Anbieter-URL aus der IAM-Konsole übereinstimmt (Schritt 2).
    Wenn die OIDC-Anbieter-URL für Ihren Amazon EKS-Cluster mit keiner der OIDC-Anbieter-URLs in der IAM-Konsole übereinstimmt, müssen Sie einen neuen IAM-OIDC-Anbieter erstellen.

Validieren Sie Ihre IAM-Rollenrichtlinien und die Konfiguration Ihrer Vertrauensrichtlinien

Ihre IAM-Rolle verfügt möglicherweise nicht über den gesamten Umfang der erforderlichen Berechtigungen. Die Vertrauensbeziehungsrichtlinie Ihrer IAM-Rolle könnte auch Syntaxfehler enthalten, wenn Sie Ihre IAM-Rolle mit der AWS-Managementkonsole oder der AWS-CLI erstellt haben.

Gehen Sie wie folgt vor, um Ihre IAM-Rollenrichtlinien zu validieren und Ihre Vertrauensrichtlinie auf Syntaxfehler zu überprüfen:

  1. Öffnen Sie die IAM-Konsole.
  2. Wählen Sie im Navigationsbereich Rollen aus und wählen Sie dann Ihre Rolle.
  3. Wählen Sie auf der Seite Ihrer Rolle den Tab Berechtigungen aus und überprüfen Sie dann, ob der Rolle alle erforderlichen Berechtigungen zugewiesen sind.
  4. Wählen Sie den Tab Vertrauensbeziehungen und dann Vertrauensbeziehung bearbeiten.
  5. Stellen Sie im Richtliniendokument für Ihre Vertrauensbeziehung sicher, dass das Format Ihrer Richtlinie dem Format der folgenden JSON-Richtlinie entspricht:
    {
      "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"
            }
          }
        }
      ]
    }
    Überprüfen Sie in Ihrer JSON-Richtlinie das Format der Federated-Eigenschaftszeile und der StringEquals-Eigenschaftszeile. Vergewissern Sie sich in der Zeile Federated, dass Ihr AWS-Regionscode (your-region-code), Ihre Konto-ID (your-account-id) und Ihre eindeutige OIDC-ID (EXAMPLE_OIDC_IDENTIFIER) korrekt formatiert sind. Bestätigen Sie in der Zeile StringEquals, dass Ihr Regionscode (your-region-code), Ihr eindeutiger OIDC-Identifier (EXAMPLE_OIDC_IDENTIFIER), der Kubernetes-Namespace (your-namespace) und der Kubernetes-Servicekontoname (your-namespace) korrekt formatiert sind.
  6. Wenn Sie Ihr Richtliniendokument bearbeiten, um Formatierungsfehler zu korrigieren, wählen Sie Vertrauensrichtlinie aktualisieren.

Vergewissern Sie sich, dass Ihr Servicekonto existiert und eine korrekt formatierte Anmerkung für den ARN der IAM-Rolle enthält

  1. Bestätigen Sie, dass Ihr Kubernetes-Servicekonto existiert:

    $ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

    Hinweis: Ersetzen Sie YOUR_ACCOUNT_NAME durch Ihren Kontonamen. Ersetzen Sie YOUR_NAMESPACE durch Ihren Namespace.
    Wenn der vorhergehende Befehl keinen Servicekontonamen zurückgibt, erstellen Sie ein Servicekonto. Weitere Informationen finden Sie unter Verwenden von mehr als einem Servicekonto auf der Kubernetes-Website.

  2. Vergewissern Sie sich, dass Ihr Servicekonto den Namen hat, den Sie erwarten. Stellen Sie außerdem sicher, dass die role-arn-Anmerkung korrekt formatiert ist. Zum Beispiel:

    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

Verwenden Sie einen Test-Pod, um zu überprüfen, ob das Servicekonto funktioniert

Führen Sie einen Test-Pod aus, um zu überprüfen, ob das Servicekonto ordnungsgemäß funktioniert. Prüfen Sie dann, ob der Pod Umgebungsvariablen korrekt mounten kann und die angegebene IAM-Rolle übernehmen kann.

  1. Erstellen Sie eine lokale YAML-Datei namens awscli-pod.yaml. Zum Beispiel:

    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

    Hinweis: Ersetzen Sie YOUR_SERVICE_ACCOUNT durch Ihren Kubernetes-Servicekontonamen.

  2. Erstellen Sie den Test-Pod (aus der YAML-Datei) in Ihrem Namespace:

    $ kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    Hinweis: Ersetzen Sie YOUR_NAMESPACE durch Ihren Namespace.

  3. Vergewissern Sie sich, dass der awscli-Pod die richtigen Umgebungsvariablen hat:

    $ kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS

    Die Ausgabe sieht etwa wie folgt aus:

    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
  4. Vergewissern Sie sich, dass der Test-Pod die richtige IAM-Rolle hat:

    $ kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity

    Die Ausgabe sieht etwa wie folgt aus:

    {
        "UserId": "REDACTEDY471234567890:botocore-session-1632772568",
        "Account": "012345678912",
        "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568"
    }

    Notieren Sie sich den Arn-Wert, einschließlich des IAM-Rollennamens, den Sie in dieser Ausgabe erhalten.

  5. Nachdem Sie die IAM-Rolle überprüft haben, löschen Sie den awscli-Pod:

    $ kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    Wenn der awscli-Pod die richtige IAM-Rolle anzeigt, funktioniert die Funktion IAM-Rollen für Dienstkonten ordnungsgemäß.

Die vorherigen Schritte bestätigen, dass das IAM-Token korrekt in den Pod eingebunden ist. Wenn Ihre Anwendung die Tokendatei immer noch nicht richtig verwenden kann, liegt möglicherweise ein Problem auf Anwendungs- oder SDK-Ebene vor. Dieses Problem kann damit zusammenhängen, wie die Anwendung AWS-Anmeldeinformationen aufnimmt, oder weil die SDK-Version nicht unterstützt wird. Weitere Informationen finden Sie unter Verwenden der Standard-Anmeldeinformationen-Anbieterkette, Anmeldeinformationen auf der Boto3-Website und Verwenden einer unterstützten AWS SDK.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 8 Monaten