Como você define um objeto raiz padrão para subdiretórios em um site hospedado estaticamente no Cloudfront? Especificamente, gostaria www.example.com/subdir/index.html
de ser atendido sempre que o usuário solicitar www.example.com/subdir
. Observe, isso é para entregar um site estático mantido em um balde S3. Além disso, gostaria de usar uma identidade de acesso de origem para restringir o acesso ao bucket S3 apenas para o Cloudfront.
Agora, estou ciente de que o Cloudfront funciona de maneira diferente do S3 e dos estados amazônicos, especificamente :
O comportamento dos objetos raiz padrão do CloudFront é diferente do comportamento dos documentos de índice do Amazon S3. Quando você configura um bucket do Amazon S3 como um site e especifica o documento de índice, o Amazon S3 retorna o documento de índice mesmo se um usuário solicitar um subdiretório no bucket. (Uma cópia do documento de índice deve aparecer em cada subdiretório.) Para obter mais informações sobre a configuração de buckets do Amazon S3 como sites e sobre documentos de índice, consulte o capítulo Hosting Websites no Amazon S3 no Guia do desenvolvedor do Amazon Simple Storage Service.
Assim, embora o Cloudfront nos permita especificar um objeto raiz padrão, isso só funciona para www.example.com
e não para www.example.com/subdir
. Para contornar essa dificuldade, podemos alterar o nome de domínio de origem para apontar para o endpoint do site fornecido por S3. Isso funciona muito bem e permite que os objetos raiz sejam especificados uniformemente. Infelizmente, isso não parece ser compatível com as identidades de acesso de origem . Especificamente, os links acima afirmam:
Mude para o modo de edição:
Distribuições da Web - Clique na guia Origens, clique na origem que deseja editar e clique em Editar. Você só pode criar uma identidade de acesso de origem para origens cujo Tipo de Origem seja Origem S3.
Basicamente, para definir o objeto raiz padrão correto, usamos o endpoint do site S3 e não o bucket do site em si. Isso não é compatível com o uso de identidade de acesso de origem. Como tal, minhas perguntas se resumem a
É possível especificar um objeto raiz padrão para todos os subdiretórios de um site hospedado estaticamente no Cloudfront?
É possível configurar uma identidade de acesso de origem para conteúdo servido de Cloudfront onde a origem é um endpoint de site S3 e não um bucket S3?
Respostas:
ATUALIZAÇÃO: Parece que eu estava incorreto! Veja a resposta de JBaczuk, que deve ser a resposta aceita neste tópico.
Infelizmente, a resposta a ambas as perguntas é não.
1. É possível especificar um objeto raiz padrão para todos os subdiretórios de um site hospedado estaticamente no Cloudfront?
Não. Conforme declarado nos documentos do AWS CloudFront ...
2. É possível configurar uma identidade de acesso de origem para conteúdo servido de Cloudfront onde a origem é um endpoint de site S3 e não um bucket S3?
Não diretamente. Suas opções de origens com CloudFront são baldes S3 ou seu próprio servidor.
É essa segunda opção que abre algumas possibilidades interessantes, no entanto. Isso provavelmente vai contra o propósito do que você está tentando fazer, mas você pode configurar seu próprio servidor, cuja única função é ser um servidor de origem do CloudFront.
Quando chega uma solicitação para http://d111111abcdef8.cloudfront.net/install/ , o CloudFront encaminhará essa solicitação para seu servidor de origem, solicitando
/install
. Você pode configurar seu servidor de origem como quiser, inclusive para servirindex.html
neste caso.Ou você pode escrever um pequeno aplicativo da web que apenas atenda esta chamada e a obtenha diretamente do S3 de qualquer maneira.
Mas eu percebo que configurar seu próprio servidor e se preocupar com dimensionamento pode anular o propósito do que você está tentando fazer em primeiro lugar.
fonte
Não é uma maneira de fazer isso. Em vez de apontá-lo para seu intervalo, selecionando-o no menu suspenso (www.example.com.s3.amazonaws.com), aponte-o para o domínio estático de seu intervalo (por exemplo, www.example.com.s3-website-us -west-2.amazonaws.com):
Graças a este tópico do fórum AWS
fonte
HTTPS
apenas?Ativar a hospedagem S3 significa que você precisa abrir o balde para o mundo. No meu caso, eu precisava manter o intervalo privado e usar a funcionalidade de identidade de acesso de origem para restringir o acesso apenas ao Cloudfront. Como @Juissi sugeriu, uma função Lambda pode corrigir os redirecionamentos:
Depois de publicar sua função, vá para a distribuição do cloudfront no console da AWS. Vá para
Behaviors
, escolhaOrigin Request
emLambda Function Associations
e, por fim, cole o ARN em sua nova função.fonte
Existe uma outra maneira de obter um arquivo padrão servido em um subdiretório, como
example.com/subdir/
. Na verdade, você pode (programaticamente) armazenar um arquivo com a chavesubdir/
no intervalo. Este arquivo não aparecerá no console de gerenciamento S3, mas ele realmente existe e o CloudFront irá atendê-lo.fonte
A solução alternativa para o problema é utilizar lambda @ edge para reescrever as solicitações. Basta configurar o lambda para o evento de solicitação do visualizador da distribuição do CloudFront e reescrever tudo que termina com '/' E não é igual a '/' com o documento raiz padrão, por exemplo, index.html.
fonte
Há um guia "oficial" publicado no blog da AWS que recomenda a configuração de uma função Lambda @ Edge acionada por sua distribuição do CloudFront:
Siga o guia vinculado acima para ver todas as etapas necessárias para configurar isso, incluindo bucket S3, distribuição do CloudFront e criação de função Lambda @ Edge .
fonte
Outra alternativa para usar lambda @ edge é usar as páginas de erro do CloudFront. Configure uma resposta de erro personalizada para enviar todos os 403s para um arquivo específico. Em seguida, adicione javascript a esse arquivo para anexar index.html a urls que terminam em /. Código de amostra:
fonte
Eu sei que essa é uma pergunta antiga, mas eu mesma lutei contra isso. Em última análise, meu objetivo era menos definir um arquivo padrão em um diretório e mais ter o resultado final de um arquivo que foi servido sem
.html
no final deleAcabei removendo
.html
do nome do arquivo e programaticamente / manualmente defini o tipo MIME paratext/html
. Não é a maneira tradicional, mas parece funcionar e satisfaz meus requisitos para os urls bonitos sem sacrificar os benefícios do cloudformation. Definir o tipo MIME é irritante, mas um pequeno preço a pagar pelos benefícios, na minha opiniãofonte