Amazon Cloudfront dengan S3 Redirect

10

Saya mencoba melakukan sesuatu yang seharusnya relatif mudah - saya ingin mengatur beberapa domain dan subdomain untuk mengalihkan ke domain inti untuk situs kami, tetapi saya ingin meletakkan pengalihan di Cloudfront. Semuanya berfungsi kecuali mengarahkan ulang jalur root - yang memberi saya file XML yang sebagian menggambarkan ember S3.

Latar Belakang

S3

S3 memungkinkan Anda untuk menyiapkan bucket semua-redirect , seperti:

S3 dengan Redirect semua pengaturan permintaan

Pengujian ini, titik akhir web (brass9-com.s3-website-us-west-1.amazonaws.com) melakukan apa yang seharusnya - itu dialihkan ke brass9.com. Baik.

Cloudfront

Cloudfront memungkinkan Anda menunjuk ke ember S3, tetapi cara itu menyarankan Anda salah - daripada menunjuk ke ember dengan namanya, seperti brass9-com.s3.amazonaws.com, Anda harus menggunakan Titik Akhir Web di atas. Selain itu, Anda dapat membiarkan semuanya default dan mendapatkan perilaku pengalihan yang baik. Jadi, jalur seperti www.brass9.com/portfolio dengan benar mengalihkan ke tempat yang seharusnya. Bagus juga.

Masalahnya - redirect domain root

Satu hal yang kemudian gagal berfungsi adalah mengalihkan dari www.brass9.com polos . Alih-alih membuat Anda mengarahkan, itu membuat Anda mendapatkan hasil yang aneh ini:

<?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>

BAIK... . Jadi ini tidak sepenuhnya tidak terduga - karena tidak ada Objek Root Default. Tapi Objek Root Default apa yang mungkin saya tentukan untuk mencegah perilaku ini? Apa nama objek redirect S3, jika ada, yang perlu saya tunjuk? Atau apakah ada konfigurasi yang tepat lainnya, atau ini hanya bug dalam bagaimana Cloudfront dan S3 berinteraksi yang perlu diperbaiki Amazon?

Solusi Tidak Diketahui: Objek Root Default

Dimungkinkan untuk menentukan Obyek Root Default index.html, tetapi tidak membantu - hanya mengubah masalah. URL Cloudfront alih-alih diarahkan ke /index.html di situs utama, yaitu 404 (kami tidak menggunakan file index.html, ini adalah situs yang didorong kerangka kerja server-side). Saya bisa meletakkan index.html di server, tapi itu mengalahkan kenaikan kecepatan kecil menggunakan Cloudfront di tempat pertama.

Pertanyaan serupa

Satu pertanyaan menanyakan hal serupa tetapi mendapatkan kembali respons kosong 0-byte untuk beberapa alasan, bukan apa yang saya lihat, respons XML. Itu tidak termasuk pertanyaan tentang masalah itu atau resolusi.

Artikel terkait

Satu artikel mengusulkan Anda hanya melayani seluruh situs pada domain kosong dan www . Ini mengacaukan bookmark pengguna mana pun, peringkat pencarian Anda, dll, dll. Anda seharusnya tidak melakukan ini.

Beberapa membahas hosting situs web statis di S3 dan Cloudfront daripada skema pengalihan, dan begitu juga tidak terkait.

Jadi, bagaimana saya melakukan ini dengan benar?

Cuplikan layar Konfigurasi Cloudfront - tidak ada Objek Root Default, menunjuk ke asal S3. Abaikan InProgress - Saya baru saja mengaktifkan dan menonaktifkan Objek Root default untuk menguji.

Distribusi Cloudfront tanpa Objek Root Default menunjuk ke S3

Dan konfigurasi asal untuk Distribusi itu:

Asal - menunjuk ke S3, default

Chris Moschini
sumber
1
Setiap permintaan ke titik akhir situs web yang dikonfigurasikan untuk mengarahkan ulang segala sesuatu "harus" melakukan hal itu, termasuk root. Apakah Anda memiliki kebijakan bucket pada bucket pengarah ulang itu? Kedengarannya seperti Anda mungkin, tetapi Anda seharusnya tidak. Kedengarannya juga agak seperti Anda mungkin telah melihat respons dalam cache dari Cloudfront GET /sejak sebelum Anda mengoreksi konfigurasi Anda untuk menggunakan titik akhir web.
Michael - sqlbot
1
Sebenarnya itu adalah respons ListBucket yang di-cache masih melekat di S3, meskipun saya telah membatalkan dan mengubah konfigurasi CF beberapa kali. Hanya butuh satu atau empat jam untuk membersihkannya. @ Michael-sqlbot Jika Anda memposting komentar Anda sebagai Jawaban, saya dapat menandainya sebagai Diterima.
Chris Moschini

Jawaban:

4

Jika Anda memiliki masalah ini, periksa terlebih dahulu ketika Anda mengkonfigurasi asal ember s3 untuk cloudfront, autocomplete mengembalikan domain endpoint s3 REST.amazonaws.com yang mengembalikan respons ListBucketResult ini.

Anda harus menuliskan secara manual domain titik akhir situs web.s3-website-region.amazonaws.com

Penting: Jika Anda salah mengkonfigurasi cloudfront dengan titik akhir REST, Anda harus membatalkan cache melalui Invalidasi atau akan tetap mengembalikan respons REST

lapinkoira
sumber
Catatan tentang pembatalan cache akhirnya membantu saya memecahkan masalah yang saya kejar selama beberapa hari. Terima kasih!
Nate
Terima kasih banyak! Untuk pengguna Terraform, di originblok distribusi, gunakan aws_s3_bucket.BUCKET.website_endpointdi domain_name(tidak bucket_regional_name) dan tambahkan custom_origin_configblok.
dusan
Anda adalah penyelamat! Kami telah berjuang dengan masalah ini untuk hari terakhir, terus mendapatkan kembali ListBucketResult XML meskipun kami mengubah pengaturan distribusi. Akhirnya setelah menghapus distribusi dan membuat yang baru menunjuk ke domain.s3-website-region.amazonaws.com pengalihan bekerja untuk kami!
Dale Zak
2

Solusi: Atur Pengalihan seperti yang dinyatakan dalam pertanyaan lalu tunggu waktu cache S3 dan CloudFront. Mereka bisa 4 jam atau lebih, jadi Anda hanya perlu mengatur semuanya lalu menunggu dan berharap yang terbaik.

(Ini adalah solusi Michael dari Komentar, tetapi sekarang sudah bertahun-tahun dan ini benar-benar layak untuk ditandai sebagai Dijawab).

Chris Moschini
sumber
0

Menulis sebagai jawaban karena saya tidak dapat berkomentar - dari dokumentasi di http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements sepertinya Anda dapat memiliki objek root default kosong:

Jika Anda tidak ingin menentukan objek root default saat Anda membuat distribusi, sertakan elemen DefaultRootObject kosong.

Dani_l
sumber
Anda dapat (meskipun beberapa API lib melarangnya) - tetapi menggunakan Default Root Object kosong membuat saya mendapat respons XML ListBucketResult yang konyol yang Anda lihat di Pertanyaan saya.
Chris Moschini