Amazon Cloudfront com S3. Acesso negado

92

Estamos tentando distribuir os buckets S3 via Cloudfront, mas por algum motivo a única resposta é um documento XML AccessDenied como o seguinte:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>89F25EB47DDA64D5</RequestId>
    <HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

Aqui está a configuração que estamos usando:

Configurações de distribuição Configurações de origem

E aqui está a política para o balde

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *********"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::x***-logos/*"
        }
    ]
}
Jordan Adams
fonte
Configurações de comportamento do cache - imgur.com/JBZqrRm
Jordan Adams #
Verifique se o Cloudfront pode ler a partir do bucket S3.
Nathan C
Como habilito ou verifico isso?
Jordan Adams
Configurações de origem, última opção. Veja sua captura de tela. :)
Nathan C
Acho que tentei isso mais cedo e não funcionou, mas acabei de mudar novamente e está em processo de distribuição. Vou acrescentar a política do balde para o meu post :)
Jordan Adams

Respostas:

93

Se você estiver acessando a raiz da sua distribuição do CloudFront, precisará definir um objeto raiz padrão: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Para especificar um objeto raiz padrão usando o console do CloudFront:

  • Faça login no AWS Management Console e abra o console do Amazon CloudFront em https://console.aws.amazon.com/cloudfront/ .

  • Na lista de distribuições no painel superior, selecione a distribuição a ser atualizada.

  • No painel Detalhes da Distribuição , na guia Geral , clique em Editar .

  • Na caixa de diálogo Editar distribuição , no campo Objeto raiz padrão , insira o nome do arquivo do objeto raiz padrão.

    Digite apenas o nome do objeto, por exemplo index.html,. Não adicione um / antes do nome do objeto.

  • Para salvar suas alterações, clique em Sim, Editar .

Kousha
fonte
No meu caso, essa configuração não resolveu o problema. Ainda estou recebendo erro de acesso negado
KurioZ7
53

Acabei de ter o mesmo problema e, embora a resposta de Kousha resolva o problema do index.html no caminho raiz, meu problema também foi com subdiretórios, pois usei aqueles combinados com index.html para obter "URLs bonitas" (exemplo .com / algo / em vez de "feio" example.com/something.html)

Parcialmente, também é culpa da Amazon, porque quando você configura a distribuição do CloudFront, ele oferece baldes S3 para você escolher, mas se você escolher um deles, usará o URL do balde em vez do URL estático de hospedagem de sites como back-end.

Então, para corrigir o problema:

  • Ativar hospedagem estática de sites para o bucket
  • Defina o documento Index (e talvez Error ) adequadamente
  • Copiar URL do terminal - você pode encontrá-lo próximo às configurações acima - Deve ser algo como: <bucket.name> .s3-website- <aws-region> .amazonaws.com
  • Use esse URL como sua origem de distribuição do CloudFront. (Isso também tornará a configuração de Objeto Raiz Padrão do CF desnecessária, mas não prejudica defini-la de qualquer maneira)
Miroslav
fonte
Resposta perfeita a partir da data deste comentário.
Sai Ramachandran
Foi isso também para mim. Eu já tinha outro site funcionando e pensei em configurar o novo de forma idêntica. Tão fácil ignorar isso.
Günther Eberl
Você também precisa adicionar permissões públicas GetObject e ListObjects ao bucket.
Georges
8

Eu tive o mesmo problema que o @Cezz, embora a solução não funcionasse no meu caso.

Assim que a hospedagem estática do site é ativada para o bucket, isso significa que os usuários podem acessar o conteúdo por meio do URL do Cloudfront ou do URL S3, o que nem sempre é desejável. Por exemplo, no meu caso, a distribuição do Cloudfront é habilitada para SSL e os usuários não devem poder acessá-la por uma conexão não SSL.

A solução que encontrei foi:

  • manter o site estático hospedado desativado no bucket S3
  • mantenha a origem da distribuição do Cloudfront como um ID S3
  • defina "Restringir acesso ao intervalo" para "Sim" (e, para facilitar, permita que o CloudFront atualize automaticamente a política do intervalo)
  • em "Páginas de erro", crie uma resposta personalizada e mapeie o código de erro "403: Proibido" para a página de resposta desejada, por exemplo, /index.html, com um código de resposta 200

Observe que, no meu caso, estou servindo um aplicativo javascript de página única, em que todos os caminhos são resolvidos pelo index.html. Se você possui caminhos que resolvem objetos diferentes no seu bucket do S3, isso não funcionará.

Jonny Green
fonte
1
Obrigado pela sua resposta. Este funcionou para mim. Eu tive o mesmo problema que você. Como não queria que as pessoas acessassem meu bucket do S3, precisava restringir o acesso ao S3 Origin, que só funciona quando você preenche a origem, conforme sugerido pelo preenchimento automático no Cloudfront. Uma observação lateral, porém, você não precisa desativar a hospedagem estática de sites. Basta remover a política de bucket que permite acesso público.
Torsten
Isso foi realmente útil, a mensagem proibida vem do S3, que eu não percebi a princípio, então você precisa capturar isso com uma página de erro personalizada para que o seu SPA funcione.
Ivan Ivan
4

No meu caso, eu estava usando várias origens com comportamentos "Caminho padrão", juntamente com um caminho de origem no meu bucket S3:

Configuração incorreta:

Comportamento do CloudFront: /images/*->My-S3-origin

My-S3-origin: Caminho de origem: /images

Arquivos S3: /images/my-image.jpg

Solicitação GET: /images/my-image.jpg -> 403

O que estava acontecendo era que toda a solicitação GET do CloudFront é enviada para a origem: /image/my-image.jpgprefixada pelo Origin Path:, /imagespara que a solicitação no S3 pareça a /images/images/my-image.jpgque não existe.

Solução

remova o caminho de origem.

Isso me permitiu acessar o bucket com uma identidade de acesso de origem e permissões de bucket e permissões de arquivo individuais restritas.

Scott Jungwirth
fonte
1

No meu caso, eu havia configurado o Route 53 incorretamente. Eu criei um Alias ​​no meu domínio, mas apontei para o S3 Bucket em vez da distribuição do CloudFront.

Também omiti o objeto raiz padrão. O console poderia realmente ser melhorado se eles adicionassem um pouco de informação ao texto do ponto de interrogação sobre as possíveis consequências de omiti-lo.

toon81
fonte