Por que minha aplicação do Amazon EMR falha com uma AmazonS3Exception HTTP 403 “Acesso negado”?

6 minuto de leitura
0

Quando envio uma aplicação para um cluster do Amazon EMR, ela falha com uma exceção HTTP 403 de “Acesso negado” do AmazonS3Exception.

Resolução

Se você não configurar as permissões corretamente, você poderá receber um erro de “Acesso negado” no Amazon EMR ou no Amazon Simple Storage Service (Amazon S3).

Exemplo de mensagem de erro:

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8B28722038047BAA; S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=), S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=

Verifique as credenciais ou o perfil do IAM especificado no código de sua aplicação

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

Execute o comando ls no nó primário do cluster do Amazon EMR:

aws s3 ls s3://doc-example-bucket/abc/

Observação: Substitua s3://doc-example-bucket/abc/ pelo seu caminho do Amazon S3.

Se o comando anterior for bem-sucedido, as credenciais ou o perfil do AWS Identity and Access Management (AWS IAM) estão causando o erro Acesso negado.

Para solucionar esse problema, realize as etapas a seguir:

  1. Confirme se sua aplicação usa as credenciais esperadas ou assume o perfil do IAM esperado.
  2. Para verificar se o perfil tem permissões para o caminho do Amazon S3, use a AWS CLI para assumir o perfil do IAM. Em seguida, execute uma solicitação de amostra para o caminho do S3.

Verifique a política da função do perfil de instância do Amazon EC2

Se o perfil de instância do Amazon Elastic Compute Cloud (Amazon EC2) não tiver as permissões de leitura e gravação necessárias nos buckets do S3, você poderá receber um erro de Acesso negado.

Observação: por padrão, as aplicações herdam o acesso ao Amazon S3 do perfil do IAM para o perfil de instância do Amazon EC2. Verifique se as políticas do IAM anexadas ao perfil permitem as operações necessárias do S3 nos buckets de origem e destino.

Para verificar se você tem a permissão de leitura necessária, execute o comando ls:

aws s3 ls s3://doc-example-bucket/myfolder/

Exemplo de saída:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

-or-

Execute o seguinte comando:

hdfs dfs -ls s3://doc-example-bucket/myfolder

Exemplo de saída:

ls: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: RBT41F8SVAZ9F90B; S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=; Proxy: null), S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=

Certifique-se de que a função do perfil de instância tenha as permissões de leitura e gravação necessárias para os buckets do S3.

Exemplo de política do IAM:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListObjectsInBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ]
    },
    {
      "Sid": "AllObjectActions",
      "Effect": "Allow",
      "Action": "s3:*Object*",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket/*"
      ]
    }
  ]
}

Verifique o perfil do IAM para o mapeamento de perfis do EMRFS

Se você usa uma configuração de segurança para especificar perfis do IAM para o Amazon EMR File System (EMRFS), então você usa o mapeamento de perfis. Sua aplicação herda as permissões do S3 do perfil do IAM com base na configuração do mapeamento de perfis.

A política do IAM anexada aos perfis deve ter as permissões necessárias do S3 nos buckets de origem e destino. Para especificar solicitações de perfis do IAM para o EMRFS ao Amazon S3, consulte Defina uma configuração de segurança com perfis do IAM para o EMRFS.

Verifique a política de endpoint da VPC do Amazon S3

Se a tabela de rotas de sub-redes do cluster do EMR tiver uma rota para um endpoint de nuvem privada virtual (VPC) do Amazon S3, confirme se a política de endpoint permite as operações necessárias do Amazon S3.

Use a AWS CLI

Execute o comentário describe-vpc-endpoints da AWS CLI para verificar a política de endpoints:

aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-########"

Observação: Substitua vpce-######## pelo seu ID de VPC.

Execute o comando modify-vpc-endpoint para modificar a política de endpoint:

aws ec2 modify-vpc-endpoint --vpc-endpoint-id "vpce-########" --policy-document file://policy.json

Observação: Substitua --vpc-endpoint-id e o caminho do arquivo JSON.

Use o console do Amazon VPC

Conclua as seguintes etapas:

  1. Abra o console da Amazon VPC.
  2. No painel de navegação, escolha Endpoints.
  3. Selecione o endpoint do Amazon S3 que está na tabela de rotas de sub-redes do cluster do EMR.
  4. Escolha a guia Política.
  5. Escolha Editar política.

Verifique as políticas de bucket de origem e destino do S3

Políticas de bucket especificam as ações que são permitidas ou negadas a entidades principais. As políticas de bucket de origem e destino devem permitir que a função do perfil de instância ou o perfil do IAM mapeado execute as operações necessárias do Amazon S3.

Para modificar as políticas do bucket, use a AWS CLI ou o console do Amazon S3.

Use a AWS CLI

Execute o comando get-bucket-policy para obter a política do bucket:

aws s3api get-bucket-policy --bucket doc-example-bucket

Observação: Substitua doc-example-policy pelo nome do bucket de origem ou destino.

Modifique a política e salve-a em um arquivo JSON.

Em seguida, execute o comando put-bucket-policy para adicionar a política modificada ao bucket:

aws s3api put-bucket-policy --bucket doc-example-bucket --policy file://policy.json

Observação: Substitua o nome do bucket e o caminho do arquivo JSON.

Use o console do Amazon S3

Para obter instruções, consulte Adicionar uma política de bucket usando o console do Amazon S3.

Importante: se a sua aplicação acessar um bucket do S3 que pertence a outra conta da AWS, o proprietário dessa conta deverá permitir seu perfil do IAM na política do bucket.

Por exemplo, a política de bucket a seguir concede acesso total a s3://doc-example-bucket/myfolder/ para todos os perfis e usuários do IAM em emr-account.

{
  "Id": "MyCustomPolicy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "myfolder/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "myfolder/*"
          ]
        }
      }
    },
    {
      "Sid": "AllowAllS3ActionsInUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
       "arn:aws:s3:::doc-example-bucket/myfolder/*",
        "arn:aws:s3:::doc-example-bucket/myfolder*"
      ]
    }
  ]
}

Informações relacionadas

Por que meu trabalho do Spark ou Hive no Amazon EMR falha com uma AmazonS3Exception HTTP 503 “Desacelerar”?

Por que minha aplicação do Amazon EMR apresenta uma falha com uma AmazonS3Exception HTTP 404 “Não encontrado”?

Respostas de erro

Como faço para solucionar erros 403 de acesso negado do Amazon S3?

AWS OFICIAL
AWS OFICIALAtualizada há 4 meses