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

7 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 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). O erro é semelhante à seguinte mensagem:

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=

Primeiro, verifique as credenciais ou o perfil especificado no código da sua aplicação

Execute o comando a seguir no nó principal do cluster do EMR. Substitua s3://doc-example-bucket/abc/ pelo seu caminho do Amazon S3.

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

Se esse comando for bem-sucedido, as credenciais ou o perfil especificados no código da sua aplicação estão causando o erro de “Acesso negado”. Confirme se a aplicação está usando as credenciais corretas ou assumindo o perfil esperado e se ela tem acesso ao caminho do Amazon S3. Verifique se o perfil tem permissões para o caminho do Amazon S3, assumindo o perfil 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 falhar, verifique se você está usando a versão mais recente da AWS Command Line Interface (AWS CLI). Em seguida, verifique o seguinte para resolver o erro de “Acesso negado”:

Verifique a política da função de 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 o 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. Certifique-se de que as políticas do IAM anexadas a esse perfil permitam as operações necessárias do S3 nos buckets de origem e 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 ter a seguinte aparência:

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 ter a seguinte aparência:

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 de 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 política do IAM a seguir fornecem o acesso necessário de leitura e gravação 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 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 EMRFS, está usando 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 a esses 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 de VPC do Amazon S3

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

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 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 endpoint usando o console da Amazon VPC:

  1. Abra o console da Amazon VPC.
  2. No painel de navegação, selecione Endpoints.
  3. Selecione o endpoint do Amazon S3 (o que está na tabela de rotas de sub-redes do cluster do EMR). Em seguida, escolha a guia Política para revisar a política de endpoint.
  4. Para adicionar as ações necessárias do Amazon S3, 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 de perfil de instância do EC2 ou o perfil do IAM mapeado execute 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 uma política de bucket. Substitua doc-example-bucket pelo nome do bucket de origem ou destino.

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

Se necessário, execute o comando a seguir para carregar uma política de bucket 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 Permissões.
  4. Escolha Política de bucket para revisar e modificar a política de bucket.

Acesso a buckets do S3 em outra conta

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á 2 anos