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

6 minuto de leitura
0

Eu tento usar um perfil do AWS Identity and Access Management (IAM) para uma conta de serviço. Meu pod Amazon Elastic Kubernetes Service (Amazon EKS) falha em assumir o perfil do IAM atribuído com 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 do perfil do IAM atribuída ao meu pod.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

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

Crie um provedor IAM OIDC para seu cluster, se ainda não tiver um. Você deve ter um provedor de identidade OIDC para seu cluster para usar um perfil 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. No painel de navegação, escolha Provedores de identidade.
  2. Na coluna Provedor, identifique e anote a URL do provedor OIDC.
  3. Em uma guia ou janela separada, abra o console do Amazon EKS. Em seguida, escolha Clusters no painel de navegação.
  4. Escolha seu cluster e, em seguida, escolha a guia Configuração.
  5. Na seção Detalhes, observe o valor da propriedade do URL do fornecedor do OpenID Connect.
  6. Verifique se a URL do provedor OIDC do console do Amazon EKS (etapa 5) corresponde à URL do provedor OIDC do console do IAM (etapa 2).
    Se a URL do provedor OIDC para seu cluster Amazon EKS não corresponder a nenhuma das URLs do provedor OIDC no console do IAM, você deverá criar um novo provedor IAM OIDC.

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

Seu perfil do IAM pode não ter toda a gama de permissões necessárias. A política de relacionamento de confiança do seu perfil do IAM também pode ter erros de sintaxe, se você criou seu perfil do IAM com o Console de Gerenciamento da AWS ou o AWS CLI.

Para validar suas políticas de perfil 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 Perfis e depois escolha seu perfil.
  3. Escolha a guia Permissões na página do perfil e verifique se todas as permissões necessárias estão atribuídas ao perfil.
  4. Escolha a guia Relações de confiança e, em seguida, escolha Editar relação de confiança.
  5. No documento de política da sua relação de confiança, verifique se o formato da sua 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",
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    Em sua política JSON, revise o formato da linha de propriedade Federada e da linha de propriedade StringEquals. Na linha Federada, confirme se seu código de região da AWS (your-region-code), ID da conta (your-account-id) e identificador OIDC exclusivo (EXAMPLE_OIDC_IDENTIFIER) estão formatados corretamente. Na linha StringEquals, confirme se o código da região (your-region-code), o identificador exclusivo do OIDC (EXAMPLE_OIDC_IDENTIFIER), o namespace do Kubernetes (your-namespace) e o nome da conta do serviço Kubernetes (your-namespace) estão formatados corretamente.
  6. Se você editar seu documento de política para corrigir erros de formatação, escolha Atualizar política de confiança.

Confirme se sua conta de serviço existe e tem uma anotação formatada corretamente para o ARN do perfil 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 sua 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. Para obter mais informações, consulte Usar mais de uma ServiceAccount no site do Kubernetes.

  2. Confirme se sua conta de serviço tem o nome que você espera. Além disso, confirme se sua 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

Usar um pod de teste para verificar se a conta de serviço funciona

Execute um pod de teste para verificar se a conta de serviço funciona corretamente. Em seguida, verifique se o pod pode montar as variáveis de ambiente corretamente e se pode assumir a perfil do IAM especificada.

  1. Criar 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 sua conta de serviço Kubernetes.

  2. Crie o pod de teste (a partir do arquivo YAML) em seu 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

    A saída é semelhante ao seguinte:

    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á com o perfil do IAM correto:

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

    A saída é semelhante ao seguinte:

    {
        "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 do perfil do IAM que você recebe nessa saída.

  5. Depois de verificar o perfil do IAM, exclua o pod awscli:

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

    Se o pod awscli mostrar o perfil do IAM correto, o recurso de perfis do IAM para contas de serviço funcionará corretamente.

As etapas anteriores confirmam que o token do IAM está montado corretamente no pod. Se seu aplicativo ainda não conseguir usar o arquivo de token corretamente, talvez haja um problema no nível do aplicativo ou do SDK. Esse problema pode estar relacionado à forma como o aplicativo ingere as credenciais da AWS ou porque a versão do SDK não é suportada. Para obter mais informações, consulte Uso da cadeia de provedores de credenciais padrão, Credenciais no site do Boto3 e Uso de um SDK da AWS compatível.

AWS OFICIAL
AWS OFICIALAtualizada há 9 meses