Come posso risolvere i problemi più comuni con i carichi di lavoro SDK AWS in Amazon EKS?

6 minuti di lettura
0

Ho usato AWS SDK per sviluppare un'applicazione container per Amazon Elastic Kubernetes Service (Amazon EKS). Quando provo a effettuare chiamate ai servizi AWS, ottengo un errore.

Risoluzione

Quando distribuisci un'applicazione container che utilizza AWS SDK su un cluster Amazon EKS, potresti ottenere uno dei seguenti errori:

  • NoCredentialsError: Impossibile trovare le credenziali
  • Errore di connessione dell'endpoint
  • ClientError: Si è verificato un errore (AccessDenied)
  • ClientError: Si è verificato un errore (UnauthorizedOperation)

Il messaggio di errore specifico dipende dal linguaggio di programmazione AWS SDK adoperato dall'applicazione. Per risolvere i problemi legati all’errore, fare riferimento ai seguenti passaggi.

Impossibile trovare le credenziali

Se Amazon EKS non riesce a trovare le credenziali del pod personale, otterrai un errore simile a questo:

"File "/usr/local/lib/python2.7/site-packages/botocore/auth.py", riga 315, in add_auth
genera NoCredentialsError
BotoCore.Exceptions.NoCredentials Error: Impossibile trovare le credenziali"

Questo errore si verifica quando non configuri le credenziali del pod, non le hai configurate correttamente o la versione dell'SDK di AWS non è supportata.

Per risolvere questo errore, consigliamo di utilizzare i ruoli di AWS Identity and Access Management (IAM). In genere, crei e distribuisci le credenziali AWS per il client SDK nell'applicazione o con il ruolo dell'istanza Amazon EC2. Altrimenti, configura i tuoi pod per utilizzare i ruoli IAM per gli account di servizio. Associa un ruolo IAM a un account del servizio Kubernetes, quindi configura i tuoi pod per utilizzare l'account del servizio.

Importante: i contenitori dei tuoi pod devono utilizzare una versione di AWS SDK che supporti l'assunzione di un ruolo IAM tramite un file di token di identità web OpenID Connect.

Impossibile connettersi all'URL dell'endpoint

Se il pod non è in grado di comunicare con gli endpoint del servizio AWS, si visualizzerà un errore simile a questo:

"File "/usr/local/lib/python2.7/site-packages/botocore/retryhandler.py", riga 359, in _check_caught_exception
rileva caught_exception
botocore.exceptions.EndpointConnectionError: Impossibile connettersi all'URL dell'endpoint: "https://ec2.eu-west-1.amazonaws.com/"
botocore.exceptions.EndpointConnectionError: Impossibile connettersi all'URL dell'endpoint: "https://sts.eu-west-1.amazonaws.com/""

Per risolvere questo errore, risolvi i problemi relativi al DNS e conferma i seguenti punti:

Controlla se i pod CoreDNS sono in esecuzione nel cluster

Esegui il seguente comando:

kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o wide

Riceverai un output simile al seguente:

NAME                       READY   STATUS    RESTARTS   AGE   IP                NODE                                            NOMINATED NODE   READINESS GATES  
coredns-7f85bf9964-kz8lp   1/1     Running   0          15d   192.168.100.36    ip-192-168-101-156.eu-west-1.compute.internal   <none>           <none>  
coredns-7f85bf9964-wjxvb   1/1     Running   0          15d   192.168.135.215   ip-192-168-143-137.eu-west-1.compute.internal   <none>           <none>

Assicurati di disporre di nodi worker in esecuzione con capacità sufficiente nel cluster Amazon EKS per eseguire correttamente i pod CoreDNS.

Risoluzione dell'endpoint di test

Verifica che il pod CoreDNS e l'application pod siano in grado di risolvere l'endpoint del servizio AWS che desideri che il pod richiami. Esegui il seguente comando:

nslookup SERVICE_ENDPOINT  

nslookup ec2.eu-west-1.amazonaws.com  

nslookup ec2.amazonaws.com

Nota: sostituisci SERVICE_ENDPOINT con l'ENDPOINT stampato nel messaggio di errore.

Si è verificato un errore (AccessDenied) durante la chiamata all'operazione AssumeRoleWithWebIdentity

Nel caso in cui il pod non sia in grado di richiedere una credenziale di sicurezza temporanea, si visualizzerà un errore simile a questo:

"File "/usr/local/lib/python3.11/site-packages/botocore/client.py", riga 960, in _make_api_call
genera error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Si è verificato un errore (AccessDenied) durante la chiamata all'operazione AssumeRoleWithWebIdentity: Non autorizzato a eseguire sts:AssumeRoleWithWebIdentity"

Per risolvere questo errore, completa i seguenti passaggi:

Conferma il ruolo IAM assunto

Verifica che il Pod assuma un ruolo IAM associato a un account di servizio Kubernetes esistente nel cluster. In caso contrario, il pod assume il ruolo IAM del nodo Amazon EKS. Per ottenere il ruolo IAM dell'account di servizio ARN, esegui il seguente comando:

kubectl get serviceaccount -A  

kubectl describe serviceaccount serviceaccount_name -n namespace_name | grep -i arn

Nota: sostituisci serviceaccount_name e namespace_name con i tuoi valori.

Riceverai un output simile al seguente:

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::11112222333:role/AccessEC2role

Controlla gli eventi di CloudTrail

Verifica a quale identità IAM è stato negato l'accesso per l’esecuzione diAssumeRoleWithWebIdentity ** ActionView**. Per fare ciò, controlla gli eventi di AWS CloudTrail nella console CloudTrail.

  1. Accedi alla console CloudTrail.
  2. Nel riquadro di navigazione, scegli Event history.
  3. Nel menu a discesa degli attributi di ricerca, modifica la selezione da Read-only a Event name.
  4. Nella barra di ricerca inserisci il nome di un evento, inserisci AssumeRoleWithWebIdentity. Ispeziona l'elenco degli eventi che appare nel riquadro dei contenuti. Vedi il seguente esempio di evento negato:
{  
    "eventVersion": "1.08",  
    "userIdentity": {  
        "type": "WebIdentityUser",  
        "userName": "system:serviceaccount:serverless:aws-sdk"  
    },  
    "eventName": "AssumeRoleWithWebIdentity",  
    "errorCode": "AccessDenied",  
    "errorMessage": "An unknown error occurred",  
    "requestParameters": {  
        "roleArn": "arn:aws:iam::11112222333:role/AccessEC2role",  
        "roleSessionName": "botocore-session-1675698641"  
    }  
}

In questo output, roleArn deve essere lo stesso ruolo IAM che hai configurato per l'account di servizio del pod.
Lo userName (system:serviceaccount:serverless:aws-sdk) deve corrispondere al nome dell'account del servizio e al relativo namespace. Il formato per questo nome è system:serviceaccount:namespace:serviceaccount_name.

Configura il ruolo IAM dell'account di servizio del pod

Nella console IAM, configura il ruolo IAM dell'account di servizio del pod con la dichiarazione di policy di fiducia IAM corretta:

     {  
            "Effect": "Allow",  
            "Principal": {  
                "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD"  
            },  
            "Action": "sts:AssumeRoleWithWebIdentity",  
            "Condition": {  
                "StringEquals": {  
                    "oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD:sub": "system:serviceaccount:namespace_name:serviceaccount_name",  
                    "oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD:aud": "sts.amazonaws.com"  
                }  
            }  
    }     

Nota: sostituisci region_code, ACCOUNT_ID, EXAMPLE11111122222333334444ABCD, serviceaccount_name e namespace_name con i tuoi valori.

Si è verificato un errore (UnauthorizedOperation)

Il ruolo IAM che hai configurato per l'account di servizio del pod potrebbe non essere autorizzato a chiamare altri servizi AWS. In questo caso, si visualizzerà un errore simile a questo:

File "/usr/local/lib/python3.11/site-packages/botocore/client.py", riga 960, in _make_api_call
genera error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Si è verificato un errore (UnauthorizedOperation) durante la chiamata all'operazione DescribeInstances: Non sei autorizzato a eseguire questa operazione.

Per risolvere questo errore, completa i seguenti passaggi:

  1. Verifica che il pod assuma un ruolo IAM associato a un account del servizio Kubernetes. A tale scopo, consulta la sezione precedente Conferma del ruolo IAM assunto. Nota il ruolo ARN restituito da questo passaggio.
  2. Apri la console IAM. Nel riquadro di navigazione, scegliRuoli. Quindi, cerca e seleziona il ruolo ARN dal passaggio 1.
  3. Nella scheda Autorizzazioni, allega le autorizzazioni della policy IAM necessarieal ruolo IAM.

Per un pod di esempio, consulta Sample pod che esegue AWS Python SDK con provider di identità federati web come provider di credenziali su GitHub.

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa