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

Última atualização: 03/05/2022

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=

Resolução

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

Primeiro, verifique as credenciais ou a função especificada no código da sua aplicaçã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). Confirme se a aplicação está usando as credenciais esperadas ou assumindo a função esperada e se ele tem acesso ao caminho do Amazon S3. Verifique se a função tem permissões para o caminho do Amazon S3, assumindo a função do AWS Identity and Access Management (IAM) com o uso da AWS CLI. Em seguida, execute uma solicitação de amostra para o caminho do 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

    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 o erro de Acesso negado.

    Observação: por padrão, os aplicativos herdam o acesso do Amazon S3 da função do 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.

    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

    Se você usa uma configuração de segurança para especificar funções do IAM para o EMRFS, então está usando o mapeamento de função. Sua aplicação herda as permissões do S3 da função do IAM com base na configuração de mapeamento de funções.

    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. Para especificar funções do IAM para solicitações do EMRFS para o Amazon S3, consulte Definir uma configuração de segurança com funções do IAM para o EMRFS.

    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.

    Para verificar e modificar a política de endpoint usando a 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. 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

    Para verificar e modificar a política de endpoints usando o console da Amazon VPC:

    1. Abra o console da Amazon VPC.
    2. No painel de navegação, escolha 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).

    Verificar as políticas de buckets de origem e de destino do Amazon S3

    As políticas de bucket especificam as ações permitidas ou negadas para as entidades principais. As políticas 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 necessárias do Amazon S3.

    Para verificar e modificar as políticas de bucket usando a 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. Substitua o nome do bucket e o caminho do arquivo JSON.

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

    Para verificar e modificar as políticas de bucket usando o 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

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