Ir para o conteúdo

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

Quero usar um perfil do AWS Identity and Access Management (AWS IAM) para uma conta de serviço da AWS (IRSA). No entanto, meu pod Amazon Elastic Kubernetes Service (Amazon EKS) não pode assumir o perfil do IAM atribuído. Ou, em vez disso, meu Pod usa o perfil padrão do IAM que é atribuído ao nó Amazon EKS.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas 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 OpenID Connect (OIDC) para seu cluster, se você ainda não tiver um. Você deve ter um provedor OIDC para que seu cluster use um IRSA.

Em seguida, conclua as etapas a seguir para verificar se você configurou corretamente o provedor OIDC:

  1. Abra o console do IAM.
  2. No painel de navegação, escolha Provedores de identidade.
  3. Em Provedor, identifique e anote o URL do provedor OIDC.
  4. Em uma guia ou janela separada, abra o console do Amazon EKS.
  5. No painel de navegação, escolha Clusters.
  6. Escolha seu cluster e, em seguida, escolha a guia Configuração.
  7. Em Detalhes, verifique o valor do URL do provedor OpenID Connect. Verifique se ele corresponde ao URL do provedor OIDC no console do IAM.
  8. Se os URLs não corresponderem, 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

Os problemas do IAM ocorrem quando seu perfil do IAM não tem todas as permissões necessárias. A política de relacionamento de confiança do seu perfil do IAM pode ter erros de sintaxe, se você criou seu perfil do IAM com o Console de Gerenciamento da AWS ou a 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, conclua as seguintes etapas:

  1. Abra o console do IAM.
  2. No painel de navegação, escolha Perfis e depois selecione seu perfil.
  3. Escolha a guia Permissões e verifique se você atribuiu todas as permissões necessárias para sua configuração 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, verifique o formato da linha de propriedade Federada e da linha de propriedade StringEquals. Para Federada, confirme se você formatou corretamente o código da região da AWS, o ID da conta da AWS e o identificador exclusivo do OIDC. Para StringEquals, confirme se você formatou corretamente o código da região, o identificador exclusivo do OIDC, o namespace Kubernetes e o nome da conta de serviço do Kubernetes.
  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 Amazon Resource Name (ARN) do perfil do IAM

Conclua as etapas a seguir:

  1. Para confirmar que sua conta de serviço do Kubernetes existe, execute o seguinte comando:
    kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
    Observação: substitua YOUR_ACCOUNT_NAME pelo nome da sua conta e 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 usa o nome que você espera. Além disso, confirme se você formatou corretamente sua anotação role-arn. 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, pode montar variáveis de ambiente e pode assumir o perfil do IAM especificada. Conclua as etapas a seguir:

  1. Criar um arquivo YAML local chamado awscli-pod.yaml. 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. Para criar o pod de teste a partir do arquivo YAML em seu namespace, execute o seguinte comando:

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

    Observação: substitua YOUR_NAMESPACE pelo seu namespace.

  3. Para confirmar se o pod awscli tem as variáveis de ambiente AWS_ROLE_ARN e AWS_WEB_IDENTITY_TOKEN_FILE, execute o seguinte comando:

    kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS

    Exemplo de saída:

    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. Para confirmar se o pod de teste usa o perfil do IAM correto, execute o seguinte comando:

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

    Exemplo de saída:

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

    Observe o valor de Arn. Certifique-se de que o perfil do IAM seja o perfil que você deseja usar no pod.

  5. Para excluir o pod awscli, execute o seguinte comando:

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

    Observação: substitua YOUR_NAMESPACE pelo seu 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 sua aplicação ainda não conseguir usar o arquivo de token do IAM, talvez haja um problema no nível da aplicação ou do SDK. Por exemplo, pode haver problemas com a forma como a aplicação usa as credenciais da AWS ou com versões incompatíveis do SDK. Para obter mais informações, consulte Como usar a cadeia de provedores de credenciais padrão e Usar o IRSA com o SDK da AWS.

AWS OFICIALAtualizada há 6 meses