Direkt zum Inhalt

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

Lesedauer: 5 Minute
0

Ich möchte eine AWS Identity and Access Management (IAM)-Rolle für ein AWS-Servicekonto (IRSA) verwenden. Mein Amazon Elastic Kubernetes Service (Amazon EKS)-Pod kann die zugewiesene IAM-Rolle jedoch nicht übernehmen. Oder mein Pod verwendet stattdessen die Standard-IAM-Rolle, die dem Amazon EKS-Knoten zugewiesen ist.

Behebung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Stelle sicher, dass du einen IAM-OIDC-Identitätsanbieter für deinen Amazon EKS-Cluster hast

Erstelle einen IAM-OpenID-Connect (OIDC)-Anbieter für deinen Cluster, falls du noch keinen hast. Du benötigst einen OIDC-Anbieter für deinen Cluster, um eine IRSA verwenden zu können.

Führe dann die folgenden Schritte aus, um zu überprüfen, ob du den OIDC-Anbieter richtig konfiguriert hast:

  1. Öffne die IAM-Konsole.
  2. Wähle im Navigationsbereich Identitätsanbieter aus.
  3. Identifiziere und notiere dir unter Anbieter die OIDC-Anbieter-URL.
  4. Öffne in einem separaten Tab oder Fenster die Amazon-EKS-Konsole.
  5. Wähle im Navigationsbereich die Option Cluster aus.
  6. Wähle deinen Cluster und wähle dann den Tab Konfiguration aus.
  7. Überprüfe unter Details den Wert der OpenID-Connect-Anbieter-URL. Stelle sicher, dass sie mit der OIDC-Anbieter-URL in der IAM-Konsole übereinstimmt.
  8. Wenn die URLs nicht übereinstimmen, musst du einen neuen IAM-OIDC-Anbieter erstellen.

Validiere deine IAM-Rollenrichtlinien und die Konfiguration deiner Vertrauensrichtlinien

IAM-Probleme treten auf, wenn deine IAM-Rolle nicht über alle erforderlichen Berechtigungen verfügt. Oder die Vertrauensbeziehungsrichtlinie deiner IAM-Rolle könnte auch Syntaxfehler enthalten, wenn du deine IAM-Rolle mit der AWS-Managementkonsole oder der AWS-CLI erstellt hast.

Führe die folgenden Schritte aus, um deine IAM-Rollenrichtlinien zu validieren und deine Vertrauensrichtlinie auf Syntaxfehler zu überprüfen:

  1. Öffne die IAM-Konsole.
  2. Wähle im Navigationsbereich Rollen aus und wähle dann deine Rolle aus.
  3. Wähle den Tab Berechtigungen aus und stelle dann sicher, dass du der Rolle alle für deine Konfiguration erforderlichen Berechtigungen zugewiesen hast.
  4. Wähle den Tab Vertrauensbeziehungen und dann Vertrauensbeziehung bearbeiten aus.
  5. Stelle im Richtliniendokument für deine Vertrauensbeziehung sicher, dass das Format deiner 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üfe in deiner JSON-Richtlinie das Format der Federated-Eigenschaftszeile und der StringEquals-Eigenschaftszeile. Bestätige für Federated, dass du den AWS-Regionalcode, die AWS-Konto-ID und die eindeutige OIDC-ID korrekt formatiert hast. Stelle für StringEquals sicher, dass du den Regionalcode, die eindeutige OIDC-ID, den Kubernetes-Namespace und den Kubernetes-Servicekontonamen korrekt formatiert hast.
  6. Wenn du dein Richtliniendokument bearbeitest, um Formatierungsfehler zu korrigieren, wähle Vertrauensrichtlinie aktualisieren aus.

Vergewissere dich, dass dein Servicekonto existiert und eine korrekt formatierte Anmerkung für den Amazon-Ressourcennamen (ARN) der IAM-Rolle enthält

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um zu bestätigen, dass dein Kubernetes-Servicekonto existiert:
    kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
    Hinweis: Ersetze YOUR_ACCOUNT_NAME durch deinen Kontonamen und YOUR_NAMESPACE durch deinen Namespace.
    Wenn der vorhergehende Befehl keinen Servicekontonamen zurückgibt, erstelle ein Servicekonto. Weitere Informationen findest du unter Verwenden von mehr als einem Servicekonto auf der Kubernetes-Website.
  2. Vergewissere dich, dass dein Servicekonto den Namen verwendet, den du erwartest. Stelle außerdem sicher, dass du die Anmerkung role-arn korrekt formatiert hast. 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

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

Führe einen Test-Pod aus, um zu überprüfen, ob das Servicekonto ordnungsgemäß funktioniert, Umgebungsvariablen mounten kann und die angegebene IAM-Rolle übernehmen kann. Führe die folgenden Schritte aus:

  1. Erstelle eine lokale YAML-Datei namens awscli-pod.yaml. 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: Ersetze YOUR_SERVICE_ACCOUNT durch deinen Kubernetes-Servicekontonamen.

  2. Um den Test-Pod aus der YAML-Datei in deinem Namespace zu erstellen, führe den folgenden Befehl aus:

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

    Hinweis: Ersetze YOUR_NAMESPACE durch deinen Namespace.

  3. Führe den folgenden Befehl aus, um zu bestätigen, dass der awscli-Pod über die Umgebungsvariablen AWS_ROLE_ARN und AWS_WEB_IDENTITY_TOKEN_FILE verfügt:

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

    Beispielausgabe:

    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. Führe den folgenden Befehl aus, um zu bestätigen, dass der Test-Pod die richtige IAM-Rolle verwendet:

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

    Beispielausgabe:

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

    Notiere dir den Wert für Arn. Stelle sicher, dass die IAM-Rolle die Rolle ist, die du im Pod verwenden möchtest.

  5. Führe den folgenden Befehl aus, um den awscli-Pod zu löschen:

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

    Hinweis: Ersetze YOUR_NAMESPACE durch deinen Namespace.

Wenn der awscli-Pod die richtige IAM-Rolle anzeigt, funktioniert die Funktion „IAM-Rollen für Servicekonten“ wie erwartet. Die vorherigen Schritte bestätigen, dass du das IAM-Token korrekt auf dem Pod bereitgestellt hast. Wenn deine Anwendung die IAM-Tokendatei immer noch nicht verwenden kann, liegt möglicherweise ein Problem auf Anwendungs- oder SDK-Ebene vor. Beispielsweise kann es Probleme damit geben, wie die Anwendung AWS-Anmeldeinformationen verwendet, oder mit nicht unterstützten SDK-Versionen. Weitere Informationen findest du unter Verwenden der Standard-Anmeldeinformationen-Anbieterkette und Verwenden von IRSA mit der AWS SDK.

AWS OFFICIALAktualisiert vor 6 Monaten