Por que não consigo usar uma função do IAM para a conta de serviço no meu pod do Amazon EKS?

Data da última atualização: 05-10-2021

Tento usar uma função do AWS Identity and Access Management (IAM) para uma conta de serviço, mas meu pod do Amazon Elastic Kubernetes Service (Amazon EKS) não assume a função do IAM atribuída. Recebo um erro de autorização. Ou meu pod tenta usar a função padrão do IAM atribuída ao nó do Amazon EKS em vez da função do IAM atribuída ao meu pod.

Breve descrição

Para resolver problemas usando o recurso de funções do IAM para contas de serviço, tente o seguinte:

  • Verifique se você tem um provedor de identidade IAM OpenID Connect (OIDC) para o cluster do Amazon EKS
  • Valide suas políticas de função do IAM e a configuração da política de confiança
  • Confirme se sua conta de serviço existe e tem uma anotação formatada corretamente para o ARN da função do IAM
  • Use um pod de teste para verificar se a conta de serviço está funcionando

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), certifique-se de estar usando a versão mais recente da AWS CLI.

Resolução

Verificar se você tem um provedor de identidade IAM OIDC para o cluster do Amazon EKS

Crie um provedor IAM OIDC para o cluster se você ainda não tiver um. Você deve ter um provedor de identidade OIDC para o cluster para usar uma função do IAM para sua conta de serviço.

Em seguida, verifique se o provedor de identidade OIDC está configurado corretamente:

1.    Abra o console do IAM e escolha Identity providers (Provedores de identidade) no painel de navegação.

2.    Na coluna Provider (Provedor), identifique e anote o URL do provedor OIDC.

3.    Em uma guia ou janela separada, abra o console do Amazon EKS e escolha Clusters no painel de navegação.

4.    Escolha o cluster e, em seguida, escolha a guia Configuration (Configuração).

5.    Na seção Details (Detalhes), observe o valor da propriedade URL do provedor OpenID Connect.

6.    Verifique se o URL do provedor OIDC do console do Amazon EKS (etapa 5) corresponde ao URL do provedor OIDC do console do IAM (etapa 2).

Se o URL do provedor OIDC para o cluster do Amazon EKS não corresponder a nenhum dos URLs do provedor OIDC no console do IAM, você deverá criar um novo provedor OIDC do IAM.

Valide suas políticas de função do IAM e a configuração da política de confiança

Sua função do IAM talvez não tenha toda a gama de permissões que você espera que sejam atribuídas a essa função. A política de relação de confiança da função do IAM também pode ter erros de sintaxe, se você criou sua função do IAM usando o Console de Gerenciamento da AWS ou a AWS CLI.

Para validar suas políticas de função do IAM e verificar se há erros de sintaxe em sua política de confiança, faça o seguinte:

1.    Abra o console do IAM.

2.    No painel de navegação, escolha Roles (Funções) e, em seguida, escolha sua função.

3.    Escolha a guia Permissions (Permissões) na página da função e verifique se todas as permissões necessárias estão atribuídas à função.

4.    Clique na guia Trust Relationships (Relações de confiança) e selecione Edit trust relationship (Editar relação de confiança).

5.    No documento de política da relação de confiança, verifique se o formato da política corresponde ao formato da seguinte política 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"
        }
      }
    }
  ]
}

Na política JSON anterior, revise o formato da linha de propriedade Federated e da linha de propriedade StringEquals. Na linha Federated, confirme se o código da sua região da AWS (your-region-code), o ID da conta (your-account-id) e o identificador OIDC exclusivo (EXAMPLE_OIDC_IDENTIFIER) estão formatados corretamente. Na linha StringEquals, confirme se seu código de região (your-region-code), identificador exclusivo OIDC (EXAMPLE_OIDC_IDENTIFIER), namespace do Kubernetes (your-namespace) e nome da conta de serviço Kubernetes (your-namespace) estão formatados corretamente.

6.    Se você editar o documento de política para corrigir erros de formatação, escolha Update Trust Policy (Atualizar política de confiança).

Confirme se sua conta de serviço existe e tem uma anotação formatada corretamente para o ARN da função do IAM

1.    Confirme se sua conta de serviço do Kubernetes existe:

$ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

Observação: substitua YOUR_ACCOUNT_NAME pelo nome da conta. Substitua YOUR_NAMESPACE pelo seu namespace.

Se o comando anterior não retornar um nome de conta de serviço, crie uma conta de serviço (no site do Kubernetes).

2.    Confirme se sua conta de serviço tem o nome esperado e se a anotação role-arn está formatada corretamente. Por exemplo:

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

Use um pod de teste para verificar se a conta de serviço está funcionando

Você pode verificar se a conta de serviço está funcionando corretamente executando um pod de teste. Em seguida, verifique se o pod pode montar variáveis de ambiente corretamente e pode assumir a função do IAM especificada.

Observação: você pode enfrentar um problema relacionado às credenciais da sua aplicação, mesmo que o recurso de funções do IAM para contas de serviço funcione corretamente. Você também pode enfrentar esse problema se o pod tiver as variáveis de ambiente corretas. Para evitar esse problema, você pode usar uma imagem de contêiner da AWS CLI para verificação.

1.    Crie um arquivo YAML local chamado awscli-pod.yaml. Por exemplo:

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

Observação: substitua YOUR_SERVICE_ACCOUNT pelo nome da conta de serviço do Kubernetes.

2.    Crie o pod de teste (do arquivo YAML) no namespace:

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

Observação: substitua YOUR_NAMESPACE pelo seu namespace.

3.    Confirme se o pod awscli tem as variáveis de ambiente corretas:

$ kubectl exec -n YOUR_NAMESPACE awscli env | grep AWS

Resultado:

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.    Confirme se o pod de teste está usando a função do IAM correta:

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

Resultado:

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

Observe o valor Arn, incluindo o nome da função do IAM (your-iam-role), que você recebe na saída do comando na etapa 4.

5.    Exclua o pod awscli depois de verificar a função do IAM:

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

Se o pod awscli mostrar a função do IAM correta, o recurso de funções do IAM para contas de serviço está funcionando corretamente.

As etapas anteriores confirmam que o token do IAM está montado corretamente no pod. Se a aplicação ainda não conseguir usar o arquivo de token corretamente, é provável que haja um problema no nível do aplicativo ou do SDK. Esse problema provavelmente está relacionado à forma como a aplicação faz ingestão das credenciais da AWS. Para obter mais informações, consulte Usar a cadeia de provedores de credenciais padrão e as Credenciais (no site do Boto3).


Este artigo foi útil?


Precisa de ajuda com faturamento ou suporte técnico?