Minha aplicação do Amazon EMR apresenta falha com um erro HTTP 403 “Access Denied” AmazonS3Exception

Data da última atualização: 15-12-2020

Quando eu envio uma aplicação para um cluster do Amazon EMR, a aplicação apresenta o erro HTTP 403 "Access Denied" AmazonS3Exception:

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 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 de sua aplicação
  • A política anexada à função do perfil da instância do Amazon Elastic Compute Cloud (Amazon EC2)
  • A política de endpoints da VPC do Amazon S3
  • As políticas de buckets 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. As políticas do IAM anexadas a essa função devem permitir as operações do Amazon S3 necessárias nos buckets de origem e de destino.

Se você estiver usando o mapeamento de função do EMRFS, sua aplicação herdará as permissões do Amazon S3 da função do IAM para o usuário que enviou a aplicação. Esse usuário do IAM dever ter uma política do IAM que permita as operações do Amazon S3 necessárias nos buckets de origem e de destino.

Conferir a política de endpoints 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 endpoints. Substitua vpce-9f28e4f6 pelo ID da VPC.

aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-9f28e4f6"

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

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

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 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).

Conferir as políticas de bucket do S3

As políticas de bucket especificam as ações que são permitidas ou negadas para cada principal. As políticas de bucket para buckets de origem e de destino devem permitir que a fonte do perfil da instância do EC2 ou da função do IAM mapeada efetuem 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

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