Como solucionar problemas comuns com cargas de trabalho do AWS SDK no Amazon EKS?

6 minuto de leitura
0

Eu usei o AWS SDK para desenvolver um aplicativo de contêiner para o Amazon Elastic Kubernetes Service (Amazon EKS). Quando tento fazer chamadas para os serviços da AWS, recebo um erro.

Resolução

Ao implantar uma aplicação de contêiner que usa o AWS SDK em um cluster do Amazon EKS, você pode receber um dos seguintes erros:

  • NoCredentialsError: Não foi possível localizar as credenciais
  • EndpointConnectionError
  • **ClientError: ocorreu um erro (acesso negado) **
  • ClientError: Ocorreu um erro (UnauthorizedOperation)

A mensagem de erro específica depende da linguagem de programação do AWS SDK que a aplicação usa. Consulte as etapas de solução de problemas a seguir para verificar seu erro.

Não foi possível localizar as credenciais

Se o Amazon EKS não conseguir encontrar as credenciais do seu pod, você verá um erro semelhante à seguinte mensagem:

“File "/usr/local/lib/python2.7/site-packages/botocore/auth.py", line 315, in add_auth
raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Não foi possível localizar as credenciais"

Esse erro ocorre quando você não configura as credenciais do seu pod, não configura as credenciais corretamente ou sua versão do AWS SDK não é compatível.

Para resolver esse erro, use os perfis do AWS Identity and Access Management (IAM). Normalmente, você cria e distribui credenciais da AWS para o cliente SDK na aplicação ou com o perfil da instância do Amazon EC2. Em vez disso, configure seus pods para usar perfis do IAM para contas de serviço. Associe uma função do IAM a uma conta de serviço do Kubernetes e configure seus pods para usar a conta de serviço.

Importante: os contêineres de seus pods devem usar uma versão do AWS SDK que suporte a assumir um perfil do IAM por meio de um arquivo de token de identidade da Web do OpenID Connect.

Não foi possível conectar-se ao URL do endpoint

Se o seu pod não conseguir se comunicar com os endpoints de serviço da AWS, você verá um erro semelhante à seguinte mensagem:

"File "/usr/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 359, in _check_caught_exception
raise caught_exception
botocore.exceptions.EndpointConnectionError: Não foi possível conectar-se ao URL do endpoint: "https://ec2.eu-west-1.amazonaws.com/"
botocore.exceptions.EndpointConnectionError: Não foi possível conectar-se ao URL do endpoint: "https://sts.eu-west-1.amazonaws.com/""

Para resolver esse erro, solucione problemas de DNS e confirme os seguintes pontos:

Verifique se os pods do CoreDNS estão em execução no cluster

Execute o seguinte comando:

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

Você recebe uma saída semelhante ao exemplo a seguir:

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>

Certifique-se de ter nós de processamento em execução com capacidade suficiente no cluster do Amazon EKS para executar com êxito os pods do CoreDNS.

Teste a resolução do endpoint

Verifique se o pod do CoreDNS e o pod da aplicação podem resolver o endpoint de serviço da AWS que você deseja que o pod chame. Execute o seguinte comando:

nslookup SERVICE_ENDPOINT  

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

nslookup ec2.amazonaws.com

**Observação:**Substitua SERVICE_ENDPOINT pelo ENDPOINT impresso na mensagem de erro.

Ocorreu um erro (AccessDenied) ao chamar a operação AssumeRoleWithWebIdentity

Se seu pod não puder solicitar uma credencial de segurança temporária, você verá um erro semelhante à seguinte mensagem:

"File "/usr/local/lib/python3.11/site-packages/botocore/client.py", line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Ocorreu um erro (AccessDenied) ao chamar a operação AssumeRoleWithWebIdentity: Você não tem autorização para executar sts:AssumeRoleWithWebIdentity"

Para resolver esse erro, conclua as seguintes etapas:

Confirme o perfil do IAM assumido

Confirme se o pod assume um perfil do IAM associado a uma conta de serviço do Kubernetes que existe no cluster. Caso contrário, o pod assume o perfil do IAM de nó do Amazon EKS. Para obter o ARN do perfil do IAM da conta de serviço, execute o seguinte comando:

kubectl get serviceaccount -A  

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

**Observação:**Substitua serviceaccount_name e namespace\ _name por seus próprios valores.

Você recebe uma saída semelhante ao exemplo a seguir:

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

Confira os eventos do CloudTrail

Verifique qual identidade do IAM tem acesso negado para realizar AssumeRoleWithWebIdentity actionView. Para fazer isso, verifique os eventos do AWS CloudTrail no console do CloudTrail.

  1. Faça login no console do CloudTrail.
  2. No painel de navegação, escolha Histórico de eventos.
  3. No menu suspenso Atributos de pesquisa, altere a seleção de Somente leitura para Nome do evento.
  4. Na barra de pesquisa Inserir um nome de evento, digite AssumeRoleWithWebIdentity. Inspecione a lista de eventos que aparece no painel de conteúdo. Veja o exemplo a seguir de um evento negado:
{  
    "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"  
    }  
}

Nessa saída, o roleArn deve ter o mesmo perfil do IAM que você configurou para a conta de serviço do pod.
O userName (system:serviceaccount:serverless:aws-sdk) deve corresponder ao nome da conta de serviço e ao namespace. O formato desse nome é system:serviceaccount:namespace:serviceaccount_name.

Configure o perfil do IAM da conta de serviço do pod

No Console do IAM, configure o perfil do IAM da conta de serviço do pod com a declaração correta da política de confiança do IAM:

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

Observação: Substitua region_code, ACCOUNT_ID, EXAMPLE11111122222333334444ABCD, serviceaccount_name e namespace_name por seus próprios valores.

Ocorreu um erro (UnauthorizedOperation)

O perfil do IAM que você configurou para a conta de serviço do pod pode não estar autorizada a chamar outros serviços da AWS. Nesse caso, você vê um erro semelhante à seguinte mensagem:

File "/usr/local/lib/python3.11/site-packages/botocore/client.py", line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Ocorreu um erro (UnauthorizedOperation) ao chamar a operação DescribeInstances: Você não tem autorização para realizar essa operação.

Para resolver esse erro, conclua as seguintes etapas:

  1. Confirme se o pod assume um perfil do IAM associado a uma conta de serviço do Kubernetes. Para fazer isso, consulte a seção anterior Confirmar o perfil assumido do IAM. Observe o ARN do perfil que essa etapa retorna.
  2. Abra o console do IAM. No painel de navegação, selecione Perfis. Em seguida, pesquise e selecione o ARN do perfil na Etapa 1.
  3. Na guia Permissões, anexe as permissões de política do IAM necessárias ao perfil do IAM.

Para ver um exemplo de pod, consulte Exemplo de pod executando o AWS Python SDK com provedor de identidade federado da Web como provedor de credenciais no Github.

AWS OFICIAL
AWS OFICIALAtualizada há um ano