Perché non posso utilizzare un ruolo IAM per l'account di servizio nel mio pod Amazon EKS?

Ultimo aggiornamento: 05-10-2021

Provo a utilizzare un ruolo AWS Identity and Access Management (IAM) per un account di servizio, ma il pod Amazon Elastic Kubernetes Service (Amazon EKS) non assume il ruolo IAM assegnato. Ricevo un errore di autorizzazione. In alternativa, il pod prova a utilizzare il ruolo IAM predefinito assegnato al nodo Amazon EKS anziché il ruolo IAM assegnato al pod.

Breve descrizione

Per risolvere i problemi utilizzando la funzione Ruoli IAM per account di servizio, prova quanto segue:

  • Verifica di disporre di un provider di identità IAM OpenID Connect (OIDC) per il cluster Amazon EKS.
  • Verifica le policy del ruolo IAM e della configurazione delle policy di attendibilità
  • Verifica che il tuo account di servizio esista e abbia un'annotazione formattata correttamente per l'ARN del ruolo IAM
  • Usa un pod di prova per verificare che l'account di servizio funzioni

Nota: se durante l’esecuzione dei comandi di AWS Command Line Interface (AWS CLI) ricevi un messaggio di errore assicurati di utilizzare la versione più recente di AWS CLI.

Risoluzione

Verifica di disporre di un provider di identità IAM OIDC per il cluster Amazon EKS

Crea un provider IAM OIDC per il tuo cluster, se non ne hai già uno. Per utilizzare un ruolo IAM per l'account del servizio è necessario disporre di un provider di identità OIDC per il cluster.

Successivamente, verifica che il provider di identità OIDC sia configurato correttamente:

1.    Apri la console IAM, quindi scegli Provider di identità dal riquadro di navigazione.

2.    Nella colonna Provider, identifica e prendi nota dell'URL del provider OIDC.

3.    In una scheda o in una finestra separata, apri la console Amazon EKS, quindi scegli Cluster dal pannello di navigazione.

4.    Scegli il tuo cluster, quindi seleziona la scheda Configurazione.

5.    Nella sezione Dettagli, prendi nota del valore della proprietà URL del provider OpenID Connect.

6.    Verifica che l'URL del provider OIDC dalla console Amazon EKS (fase 5) corrisponda all'URL del provider OIDC della console IAM (fase 2).

Se l'URL del provider OIDC per il cluster Amazon EKS non corrisponde a nessuno degli URL del provider OIDC nella console IAM, è necessario creare un nuovo provider IAM OIDC.

Verifica le policy del ruolo IAM e della configurazione delle policy di attendibilità

Il tuo ruolo IAM potrebbe non disporre dell'intera gamma di autorizzazioni che prevedi siano assegnate a quel ruolo. La policy di relazione di attendibilità del tuo ruolo IAM potrebbe anche avere errori di sintassi, se il ruolo IAM è stato creato dalla Console di gestione AWS o da AWS CLI.

Per verificare le policy del ruolo IAM e controllare la presenza di errori di sintassi nella policy di attendibilità, procedi come segue:

1.    Apri la console IAM.

2.    Nel pannello di navigazione, scegli Ruoli, quindi seleziona il tuo ruolo.

3.    Seleziona la scheda Autorizzazioni nella pagina del tuo ruolo, quindi verifica che tutte le autorizzazioni richieste siano assegnate.

4.    Passa alla scheda Relazioni di attendibilità e scegli Modifica relazione di attendibilità.

5.    Nel documento delle policy per la relazione di attendibilità, verifica che il formato della policy corrisponda al formato della seguente politica JSON:

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

Nella policy JSON precedente, esamina il formato della riga della proprietà Federated e della riga della proprietà StringEquals. Nella riga Federated, verifica che il codice della tua regione AWS (your-region-code), l'ID account (your-account-id) e l'identificatore OIDC univoco (EXAMPLE_OIDC_IDENTIFIER) siano formattati correttamente. Nella riga StringEquals, conferma che il tuo codice regionale (your-region-code), l'identificatore univoco OIDC (EXAMPLE_OIDC_IDENTIFIER), lo spazio dei nomi Kubernetes (your-namespace) e l'account del servizio Kubernetes name (your-namespace) siano formattati correttamente.

6.    Se modifichi il documento delle policy per correggere gli errori di formattazione, scegli Aggiorna policy di attendibilità.

Verifica che il tuo account di servizio esista e abbia un'annotazione formattata correttamente per l'ARN del ruolo IAM

1.    Conferma che il tuo account di servizio Kubernetes esista:

$ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

Nota: sostituisci YOUR_ACCOUNT_NAME con il nome del tuo account. Sostituisci YOUR_NAMESPACE con il tuo spazio dei nomi.

Se il comando precedente non restituisce un nome account di servizio, crea un account di servizio (dal sito Web di Kubernetes).

2.    Verifica che l'account del servizio abbia il nome previsto e che l'annotazione relativa role-arn sia formattata correttamente. Ad esempio:

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

Usa un pod di prova per verificare che l'account di servizio funzioni

Puoi verificare che l'account del servizio funzioni correttamente eseguendo un pod di prova. Quindi, controlla se il pod è in grado di montare correttamente le variabili d'ambiente e può assumere il ruolo IAM specificato.

Nota: è possibile che si verifichi un problema relativo alle credenziali dell'applicazione anche se la funzione dei ruoli IAM per gli account di servizio funziona correttamente. Questo problema può verificarsi anche se il pod ha le variabili di ambiente corrette. Per evitare questo problema, puoi utilizzare un'immagine del container di AWS CLI per la verifica.

1.    Crea un file YAML locale chiamato awscli-pod.yaml. Ad esempio:

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

Nota: sostituisci YOUR_SERVICE_ACCOUNT con il nome dell'account del servizio Kubernetes.

2.    Crea il pod di test (dal file YAML) nel tuo spazio dei nomi:

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

Nota: sostituisci YOUR_NAMESPACE con il tuo spazio dei nomi.

3.    Verifica che il pod awscli abbia le variabili d'ambiente corrette:

$ kubectl exec -n YOUR_NAMESPACE awscli env | grep AWS

Output:

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.    Verifica che il pod di test utilizzi il ruolo IAM corretto:

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

Output:

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

Prendi nota del valore Arn, incluso il nome del ruolo IAM (your-iam-role), che ricevi nell'output dal comando nella fase 4.

5.    Eliminare il pod awscli dopo aver verificato il ruolo IAM:

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

Se il pod awscli riporta il ruolo IAM corretto, la funzionalità dei ruoli IAM per gli account di servizio funziona correttamente.

Le fasi precedenti confermano che il token IAM è montato correttamente sul pod. Se l'applicazione non è ancora in grado di utilizzare correttamente il file del token, è probabile che si sia verificato un problema a livello di applicazione o SDK. Questo problema è probabilmente correlato al modo in cui l'applicazione importa le credenziali AWS. Per ulteriori informazioni, consulta Utilizzo della catena del provider di credenziali di default e Credenziali (dal sito Web Boto3).


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?