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

Letzte Aktualisierung: 05.10.2021

Ich versuche, eine AWS-Identity-and-Access-Management-Rolle (IAM) für ein Dienstkonto zu verwenden. Aber mein Amazon-Elastic-Kubernetes-Service-Pod (Amazon EKS) übernimmt die zugewiesene IAM-Rolle nicht. Ich erhalte einen Autorisierungsfehler. Oder mein Pod versucht, die standardmäßige IAM-Rolle zu verwenden, die dem Amazon-EKS-Knoten zugewiesen ist, anstelle der IAM-Rolle, die meinem Pod zugewiesen ist.

Kurzbeschreibung

Versuchen Sie Folgendes, um Probleme mit der Funktion IAM-Rollen für Dienstkonten zu beheben:

  • Stellen Sie sicher, dass Sie einen IAM-OpenID-Connect-Identitätsanbieter (OIDC) für Ihr Amazon-EKS-Cluster haben
  • Validieren Sie Ihre IAM-Rollenrichtlinien und Konfiguration von Vertrauensrichtlinien
  • Vergewissern Sie sich, dass Ihr Dienstkonto existiert und eine ordnungsgemäß formatierte Anmerkung für den ARN der IAM-Rolle enthält
  • Verwenden Sie einen Test-Pod, um zu überprüfen, ob das Dienstkonto funktioniert

Hinweis: Wenn Sie beim Ausführen von AWS-Command-Line-Interface-Befehlen (AWS CLI) Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.

Auflösung

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

Erstellen Sie einen IAM-OIDC-Anbieter für Ihr Cluster, falls Sie noch keinen haben. Sie benötigen einen OIDC-Identitätsanbieter, damit Ihr Cluster eine IAM-Rolle für Ihr Dienstkonto verwenden kann.

Stellen Sie als Nächstes sicher, dass der OIDC-Identitätsanbieter richtig konfiguriert ist:

1.    Öffnen Sie die IAM-Konsole und wählen Sie dann im Navigationsbereich Identitätsanbieter aus.

2.    Identifizieren und notieren Sie in der Spalte Anbieter die URL des OIDC-Anbieters.

3.    Öffnen Sie in einer separaten Registerkarte oder einem separaten Fenster die Amazon-EKS-Konsole, und wählen Sie dann Cluster aus dem Navigationsbereich.

4.    Wählen Sie Ihr Cluster und dann die Registerkarte Konfiguration aus.

5.    Beachten Sie im Abschnitt Details den Wert der Eigenschaft OpenID Connect Provider URL.

6.    Stellen Sie sicher, dass die OIDC-Anbieter-URL von 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 Konfiguration von Vertrauensrichtlinien

Ihre IAM-Rolle verfügt möglicherweise nicht über das gesamte Spektrum an Berechtigungen, von denen Sie erwarten, dass sie dieser Rolle zugewiesen sind. Die Vertrauensbeziehungsrichtlinie Ihrer IAM-Rolle kann auch Syntaxfehler aufweisen, wenn Sie Ihre IAM-Rolle mithilfe der AWS-Managementkonsole oder AWS CLI erstellt haben.

Gehen Sie wie folgt vor, um Ihre IAM-Rollenrichtlinien zu überprüfen und nach Syntaxfehlern in Ihrer Vertrauensrichtlinie zu suchen:

1.    Öffnen Sie die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Rollen und wählen Sie dann Ihre Rolle.

3.    Wählen Sie auf der Seite Ihrer Rolle die Registerkarte Berechtigungen und überprüfen Sie dann, ob alle erforderlichen Berechtigungen der Rolle zugewiesen sind.

4.    Wählen Sie die Registerkarte Vertrauensbeziehungen und dann Vertrauensbeziehung bearbeiten aus.

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

Überprüfen Sie in der vorherigen JSON-Richtlinie das Format der verbundenen Grundstücksgrenze und der Grundstücksgrenze StringEquals. Bestätigen Sie in der Zeile Verbunden, dass Ihr AWS-Regionscode (your-region-code), Ihre Konto-ID (your-account-id) und Ihre eindeutige OIDC-Kennung (EXAMPLE_OIDC_IDENTIFIER) korrekt formatiert sind. Bestätigen Sie in der Zeile StringEquals, dass Ihr Regionscode (your-region-code), der eindeutige OIDC-Bezeichner (EXAMPLE_OIDC_IDENTIFIER), der Kubernetes-Namespace (your-namespace) und der Kubernetes-Dienstkontoname (your-namespace) korrekt formatiert sind.

6.    Wenn Sie Ihr Richtliniendokument bearbeiten, um Formatierungsfehler zu korrigieren, wählen Sie Vertrauensrichtlinie aktualisieren aus.

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

1.    Vergewissern Sie sich, dass Ihr Kubernetes-Dienstkonto 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 Dienstkontonamen zurückgibt, erstellen Sie ein Dienstkonto (von der Kubernetes-Website).

2.    Vergewissern Sie sich, dass Ihr Dienstkonto den erwarteten Namen hat und dass die role-arn-Anmerkung korrekt formatiert ist. 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 Dienstkonto funktioniert

Sie können überprüfen, ob das Dienstkonto ordnungsgemäß funktioniert, indem Sie einen Test-Pod ausführen. Prüfen Sie dann, ob der Pod Umgebungsvariablen korrekt einhängen kann und die angegebene IAM-Rolle übernehmen kann.

Hinweis: Es kann ein Problem im Zusammenhang mit den Anmeldeinformationen Ihrer Anwendung auftreten, selbst wenn die Funktion IAM-Rollen für Dienstkonten ordnungsgemäß funktioniert. Dieses Problem kann auch auftreten, wenn Ihr Pod über die richtigen Umgebungsvariablen verfügt. Um dieses Problem zu vermeiden, können Sie ein AWS-CLI-Container-Image zur Überprüfung verwenden.

1.    Erstellen Sie 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: Ersetzen Sie YOUR_SERVICE_ACCOUNT durch den Namen Ihres Kubernetes-Dienstkontos.

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

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

Hinweis: Ersetzen SieYOUR_NAMESPACE durch Ihren Namespace.

3.    Stellen Sie sicher, dass der awscli-Pod die richtigen Umgebungsvariablen hat:

$ kubectl exec -n YOUR_NAMESPACE awscli env | grep AWS

Ausgabe:

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 verwendet:

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

Ausgabe:

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

Beachten Sie den Arn-Wert, einschließlich des IAM-Rollennamens (your-iam-role), den Sie in der Ausgabe des Befehls in Schritt 4 erhalten.

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

$ 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 vorangegangenen Schritte bestätigen, dass das IAM-Token korrekt am Pod montiert ist. Wenn Ihre Anwendung die Token-Datei immer noch nicht korrekt verwenden kann, liegt wahrscheinlich ein Problem auf Anwendungs- oder SDK-Ebene vor. Dieses Problem hängt wahrscheinlich damit zusammen, wie die Anwendung AWS-Anmeldeinformationen aufruft. Weitere Informationen finden Sie unter Verwenden der standardmäßigen Anbieterkette und der Anmeldeinformationen für Anmeldeinformationen (von der Boto3-Website).


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?