Amazon Cloudfront com redirecionamento S3

10

Estou tentando fazer algo que deve ser relativamente direto - quero configurar alguns domínios e subdomínios para redirecionar para o domínio principal do nosso site, mas quero colocar os redirecionamentos no Cloudfront. Tudo funciona, exceto o redirecionamento do caminho raiz - que me fornece um arquivo XML que descreve parcialmente o bucket S3.

fundo

S3

O S3 permite configurar um bucket de redirecionamento total , como:

S3 com redirecionar todas as solicitações de configuração

Testando isso, o terminal da Web (brass9-com.s3-website-us-west-1.amazonaws.com) faz o que deveria - ele redireciona para brass9.com. Boa.

Cloudfront

O Cloudfront permite que você aponte para um bucket do S3, mas a maneira que ele sugere isso é errado - em vez de apontar para o bucket pelo nome, como brass9-com.s3.amazonaws.com, você precisa usar o Web Endpoint acima. Fora isso, você pode deixar tudo como padrão e obter um bom comportamento de redirecionamento. Portanto, um caminho como www.brass9.com/portfolio redireciona corretamente para onde deveria. Também é bom.

O problema - o redirecionamento de domínio raiz

A única coisa que deixa de funcionar é redirecionar do site www.brass9.com . Em vez de obter um redirecionamento, você obtém esse resultado estranho:

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>brass9-com</Name><Prefix></Prefix>
<Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated>
</ListBucketResult>

ESTÁ BEM... . Portanto, isso não é completamente inesperado - porque não há Objeto Raiz Padrão. Mas qual objeto raiz padrão eu especificaria para impedir esse comportamento? Qual é o nome do objeto de redirecionamento S3, se houver, para o qual eu preciso apontar? Ou existe alguma outra configuração adequada ou isso é apenas um bug na interação do Cloudfront e S3 que a Amazon precisa corrigir?

Solução que não funciona: objeto raiz padrão

É possível especificar um Objeto Raiz Padrão de index.html, mas isso não ajuda em nada - apenas altera o problema. Em vez disso, o URL do Cloudfront é redirecionado para /index.html no site principal, que é um 404 (não usamos um arquivo index.html, é um site orientado por estrutura do servidor). Eu poderia colocar um index.html no servidor, mas isso anula o pequeno ganho de velocidade do uso do Cloudfront.

Perguntas semelhantes

Uma pergunta faz algo semelhante, mas recebe uma resposta em branco de 0 byte por algum motivo, em vez do que estou vendo, uma resposta XML. Não inclui uma pergunta sobre esse problema ou uma resolução.

Artigos relacionados

Um artigo propõe que você apenas sirva o site inteiro nos domínios bare e www . Isso estraga os favoritos de qualquer usuário, sua classificação de pesquisa, etc. Você não deve fazer isso.

Vários discutem a hospedagem de um site estático no S3 e Cloudfront, em vez de um esquema de redirecionamento e, portanto, não são relacionados.

Então, como faço isso corretamente?

Captura de tela da configuração do Cloudfront - nenhum objeto raiz padrão, apontando para a origem do S3. Ignore o InProgress - acabei de ativar e desativar o objeto raiz padrão para testar.

Distribuição Cloudfront sem Objeto Raiz Padrão apontando para S3

E a configuração de origem para essa distribuição:

Origem - aponta para S3, padrão

Chris Moschini
fonte
1
Qualquer solicitação para um endpoint de site configurado para redirecionar tudo "deve" fazer exatamente isso, incluindo a raiz. Você tem uma política de bucket nesse redirecionamento? Parece que você pode, mas não deveria. Também parece um pouco como se você estivesse vendo uma resposta em cache do Cloudfront GET /antes de corrigir sua configuração para usar o ponto de extremidade da Web.
Michael - sqlbot
1
Na verdade, era uma resposta em cache do ListBucket ainda no S3, apesar de eu ter invalidado e alterado a configuração do CF várias vezes. Leva apenas uma hora ou quatro para sair. @ Michael-sqlbot Se você postar seu comentário como resposta, posso marcar como Aceito.
Chris Moschini

Respostas:

4

Se você tiver esse problema, verifique primeiro quando configurar a origem do bucket s3 para o cloudfront, o preenchimento automático retornará o domínio do terminal REST s3.amazonaws.com, que retornará essa resposta ListBucketResult.

Você deve anotar manualmente o endpoint do site domain.s3-website-region.amazonaws.com

Importante: Se você configurou incorretamente o cloudfront com o terminal REST, precisará invalidar o cache por meio de Invalidações ou ele continuará retornando a resposta REST

lapinkoira
fonte
A observação sobre a invalidação de cache finalmente me ajudou a resolver um problema que persigo por vários dias. Obrigado!
Nate
Muito obrigado! Para usuários do Terraform, no originbloco da distribuição, use aws_s3_bucket.BUCKET.website_endpointno domain_name(not bucket_regional_name) e adicione o custom_origin_configbloco.
dusan
Você é um salva-vidas! Estamos enfrentando problemas com esse problema no último dia, continuando recuperando o XML do ListBucketResult, mesmo que estivéssemos alterando as configurações de distribuição. Finalmente, após excluir a distribuição e criar uma nova apontando para domain.s3-website-region.amazonaws.com, o redirecionamento funcionou para nós!
Dale Zak #
2

Solução: configure o redirecionamento conforme indicado na pergunta e aguarde o tempo de cache do S3 e do CloudFront. Eles podem durar 4 horas ou mais, então você só precisa configurar tudo e esperar o melhor.

(Esta é a solução de Michael nos Comentários, mas já faz anos e isso realmente merece ser marcada como Respondida).

Chris Moschini
fonte
0

Escrevendo como resposta, já que não posso comentar - na documentação em http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements , parece que você pode ter um objeto raiz padrão em branco:

Se você não deseja especificar um objeto raiz padrão ao criar uma distribuição, inclua um elemento DefaultRootObject vazio.

Dani_l
fonte
Você pode (embora algumas bibliotecas de API o proíbam) - mas o uso de um objeto raiz padrão em branco me dá a ridícula resposta XML de ListBucketResult que você vê na minha pergunta.
Chris Moschini