Por que a minha aplicação do Amazon EMR falha com um erro HTTP 403 “Access Denied” AmazonS3Exception (Acesso negado)?

Data da última atualização: 20/12/2021

Quando eu envio uma aplicação para um cluster do Amazon EMR, a aplicação falha e apresenta o erro HTTP 403 “Access Denied” AmazonS3Exception (Acesso negado):

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=

Breve descrição

Esse erro indica que a aplicação tentou realizar uma operação do Amazon Simple Storage Service (Amazon S3) que falhou por causa de um problema com:

  • As credenciais ou a função especificada no código da sua aplicação
  • A política anexada à função do perfil da instância do Amazon Elastic Compute Cloud (Amazon EC2)
  • A função do AWS Identity and Access Management (IAM) para o Sistema de arquivos do EMR (EMRFS)
  • A política de endpoint da VPC do Amazon S3
  • As políticas de bucket de origem e de destino do Amazon S3

Resolução

Execute o seguinte comando no nó principal do cluster do EMR. Substituir s3://doc-example-bucket/abc/ por seu caminho do Amazon S3.

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

Se esse comando funcionar, as credencias ou a função especificada no código de sua aplicação está causando o erro “Access Denied” (Acesso negado). As credenciais ou a função deve ter acesso ao caminho do Amazon S3.

Se esse comando não funcionar, confirme que você está usando a versão mais recente da AWS Command Line Interface (AWS CLI). Então, confira os itens a seguir para resolver o erro “Access Denied” (Acesso negado):

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

Por padrão, as aplicações herdam o acesso do Amazon S3 da função do AWS Identity and Access Management (IAM) para o perfil da instância do Amazon EC2. Certifique-se de que as políticas do IAM anexadas a essa função permitam as operações do S3 necessárias nos buckets de origem e de destino. Você pode receber o erro “Access Denied” (Acesso negado) se o perfil da instância do EC2 (função de serviço para instâncias do EC2 do cluster) não tiver as permissões de leitura e gravação necessárias nos buckets do S3.

Para solucionar esse problema, verifique se você tem a permissão de leitura necessária executando o seguinte comando:

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

A saída pode ser semelhante à seguinte:

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

-ou-

Execute o seguinte comando:

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

A saída pode ser semelhante à seguinte:

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 de perfil da instância tenha as permissões de leitura e gravação necessárias para os buckets do S3. Por exemplo, as ações do S3 na seguinte política do IAM fornecem o acesso de leitura e gravação necessário ao bucket do S3 doc-example-bucket:

{
  "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 a função do IAM relativa ao mapeamento de função do EMRFS

Ao usar uma configuração de segurança para especificar funções do IAM para o EMRFS, você configura mapeamentos de função. Cada mapeamento de função especifica uma função do IAM que corresponde a identificadores. Esses identificadores determinam a base para o acesso ao Amazon S3 por meio do EMRFS. Os identificadores podem ser usuários, grupos ou prefixos do Amazon S3 que indicam uma localização de dados.

Quando o EMRFS faz uma solicitação ao Amazon S3 e a solicitação corresponde à base de acesso, o EMRFS faz com que as instâncias do EC2 do cluster assumam a função do IAM correspondente para a solicitação. No lugar das permissões do IAM anexadas à função de serviço para instâncias do EC2 de cluster, as permissões do IAM anexadas a essa função serão aplicadas. Portanto, a política do IAM anexada a essas funções deve ter as permissões necessárias do S3 nos buckets de origem e destino.

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

Se a tabela de rotas da sub-rede do cluster do EMR tiver uma rota para um endpoint da VPC do Amazon S3, confirme se a política de endpoints permite as operações do Amazon S3 necessárias. Você pode usar a AWS CLI ou o console da Amazon VPC para conferir e modificar a política de endpoints.

AWS CLI:

Execute o comando a seguir para revisar a política de endpoint. Substitua vpce-xxxxxxxx pelo seu ID da VPC.

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

Se necessário, execute o comando a seguir para carregar uma política de endpoint modificada. No exemplo, substitua o ID da VPC e o caminho do arquivo JSON.

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

Console da Amazon VPC:

  1. Abra o console da Amazon VPC.
  2. No painel de navegação, escolha Endpoints (Endpoints).
  3. Selecione o endpoint do Amazon S3 (o que está na tabela de rotas da sub-rede do cluster do EMR). Depois, escolha a guia Policy (Política) para revisar a política de endpoints.
  4. Para adicionar as ações do Amazon S3 necessárias, escolha Edit Policy (Editar política).

Verifique as políticas de bucket do S3

As políticas de bucket especificam as ações permitidas ou negadas para as entidades principais. As políticas de bucket para buckets de origem e de destino devem permitir que a função do perfil da instância do EC2 ou a função do IAM mapeada executem as operações do Amazon S3 necessárias. Você pode usar a AWS CLI ou o console do Amazon S3 para conferir e modificar as políticas de buckets.

AWS CLI:

Execute o comando a seguir para revisar a política de buckets. Substitua doc-example-bucket pelo nome do bucket de origem ou de destino.

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

Se necessário, execute o comando a seguir para carregar uma política de buckets modificada. No exemplo, substitua o nome do bucket e o caminho do arquivo JSON.

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

Observação: se você receber erros ao executar comandos da AWS CLI, verifique se está usando a versão mais recente da AWS CLI.

Console do Amazon S3:

  1. Abra o console do Amazon S3.
  2. Escolha o bucket.
  3. Escolha a guia Permissions (Permissões).
  4. Escolha Bucket Policy (Política de buckets) para revisão e modificar a política de buckets.

Acessar buckets do S3 em outra conta

Caso sua aplicação acesse um bucket do S3 que pertença a outra conta da AWS, o proprietário da conta deverá permitir sua função do IAM na política de buckets. Por exemplo, a política de bucket a seguir concede para todas as funções do IAM e usuários em emr-account acesso completo a s3://doc-example-bucket/myfolder/.

{
  "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*"
      ]
    }
  ]
}