Por que recebo o erro “webidentityerr” quando uso o AWS Load Balancer Controller no Amazon EKS?

4 minuto de leitura
0

Recebo a seguinte mensagem de erro quando tento usar o AWS Load Balancer Controller no Amazon Elastic Kubernetes Service (Amazon EKS): “failed to find existing LoadBalancer due to WebIdentityErr: failed to retrieve credentials\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403” (falha ao encontrar o LoadBalancer existente devido ao WebIdentityErr: falha ao recuperar credenciais\ncausada por: AccessDenied: não autorizado a executar sts:AssumeRoleWithWebIdentity\n\tstatus code: 403)

Breve descrição

Você recebe esse erro quando usa o AWS Load Balancer Controller no Amazon EKS pelos seguintes motivos:

  • Configurações de conta de serviços incorretas
  • Relacionamento de confiança incorreto da função do AWS Identity and Access Management (AWS IAM) usada na conta de serviço

Com o AWS Load Balancer Controller, nós de processamento executam as tarefas. Esses nós de processamento devem ter acesso aos recursos do AWS Application Load Balancer ou do AWS Network Load Balancer usando permissões do IAM. Você pode configurar as permissões do IAM usando perfis do IAM para a conta de serviço. Como alternativa, você pode anexar as permissões do IAM diretamente aos perfis do IAM do nó de processamento. Para obter mais informações, consulte Load Balancer Controller installation (Instalação do Load Balancer Controller) no site do Kubernetes.

Resolução

Configurações de conta de serviço incorretas

Para verificar se as configurações da sua conta de serviço estão definidas corretamente, execute as seguintes etapas:

1.    Verifique o nome da conta de serviço que está definida na sua implantação:

kubectl describe deploy <aws-load-balancer-controller> -n kube-system | grep -i "Service Account"

2.    Descreva a conta de serviço:

kubectl describe sa <aws-load-balancer-controller> -n kube-system

3.    Verifique a anotação da conta de serviço para o perfil do IAM:

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxx:role/<AmazonEKSLoadBalancerControllerRole>

4.    Atualize a anotação se ela estiver ausente ou incorreta. Verifique se você associou adequadamente o perfil do IAM a uma conta de serviço:

kubectl annotate serviceaccount -n <SERVICE_ACCOUNT_NAMESPACE> <SERVICE_ACCOUNT_NAME> \ eks.amazonaws.com/role-arn=arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>

5.    Exclua e recrie todos os pods do Amazon EKS existentes associados à conta de serviço. Aplique as variáveis de ambiente de credenciais:

kubectl delete pods <aws-loadbalancer-controller-pod> -n <kube-system>

Relação de confiança incorreta entre o perfil do IAM usado e a conta de serviço

Os exemplos a seguir mostram alguns erros comuns que podem ocorrer ao ser estabelecida a relação de confiança entre o perfil do IAM e a conta de serviço.

Exemplo 1: o perfil do IAM ou a relação de confiança não está definida corretamente para a ação “sts:AssumeRoleWithWebIdentity”

Verifique se a relação de confiança está definida corretamente para a ação sts:AssumeRoleWithWebIdentity (e não para a ação sts:AssumeRole).

Veja a seguir um exemplo de uma relação de confiança que não está definida corretamente:

{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "xxxxx.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
}

Para corrigir a relação de confiança, certifique-se de defini-la para a ação sts:AssumeRoleWithWebIdentity:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>"
        }
      }
    }
  ]
}

Observação: substitua todas as variáveis por seus próprios valores.

Para usar o mesmo perfil do IAM para vários clusters de uma conta, defina a relação de confiança semelhante à seguinte:

{
 "Version": "2012-10-17",
 "Statement": [{
   "Effect": "Allow",
   "Principal": {
    "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
            "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-1-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
                                }
   }
  },
  {
   "Effect": "Allow",
   "Principal": {
    "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Prob>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
                                        "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-2-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
    }
   }
  }
 ]
}

Exemplo 2: ID incorreto de provedor de OIDC ao criar um cluster do Amazon EKS

Certifique-se de criar e verificar adequadamente um provedor de OIDC para seu cluster do Amazon EKS. Verifique se o ID do provedor de OIDC e a região da AWS associada estão listados corretamente. Caso contrário, você receberá um erro WebIdentityErr.

Exemplo 3: o nome da conta de serviço ou seu namespace não foi inserido corretamente

Insira o nome correto da conta de serviço e seu namespace quando atualizar a implantação do AWS Load Balancer Controller.

Exemplo 4: etapas “sts.amazonaws.com” ausentes da relação de confiança

Se o perfil de serviço associado ao pod do EKS não conseguir executar a operação STS na ação AssumeRoleWithWebIdentity, atualize a relação de confiança. A relação de confiança deve incluir “sts.amazonaws.com” para realizar uma operação STS.

Por exemplo:

"Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>",
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
        }
}

Para mais informações sobre as condições do IAM com várias chaves ou valores, consulte Como criar uma condição com várias chaves ou valores.


AWS OFICIAL
AWS OFICIALAtualizada há um ano