Warum kann ich keine IAM-Rolle für das Servicekonto in meinem Amazon EKS-Pod verwenden?
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:
- Öffnen Sie die IAM-Konsole. Wählen Sie im Navigationsbereich Identitätsanbieter aus.
- Identifizieren und notieren Sie in der Spalte Anbieter die OIDC-Anbieter-URL.
- Öffnen Sie in einem separaten Tab oder Fenster die Amazon EKS-Konsole. Wählen Sie dann im Navigationsbereich Cluster aus.
- Wählen Sie Ihren Cluster aus und wählen Sie dann die Registerkarte Konfiguration.
- Notieren Sie sich im Abschnitt Details den Wert der OpenID Connect-Provider-URL-Eigenschaft.
- 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:
- Öffnen Sie die IAM-Konsole.
- Wählen Sie im Navigationsbereich Rollen aus und wählen Sie dann Ihre Rolle.
- 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.
- Wählen Sie den Tab Vertrauensbeziehungen und dann Vertrauensbeziehung bearbeiten.
- Stellen Sie im Richtliniendokument für Ihre Vertrauensbeziehung sicher, dass das Format Ihrer Richtlinie dem Format der folgenden JSON-Richtlinie entspricht:
Ü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.{ "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" } } } ] }
- 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
-
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. -
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.
-
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.
-
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.
-
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
-
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.
-
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.
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 3 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren