Bagaimana Anda menyetel objek root default untuk subdirektori di situs web yang dihosting secara statis di Cloudfront? Secara khusus, saya ingin www.example.com/subdir/index.html
dilayani setiap kali pengguna meminta www.example.com/subdir
. Catatan, ini untuk mengirimkan situs web statis yang disimpan dalam keranjang S3. Selain itu, saya ingin menggunakan identitas akses asal untuk membatasi akses ke bucket S3 hanya di Cloudfront.
Sekarang, saya menyadari bahwa Cloudfront bekerja secara berbeda dari S3 dan negara bagian amazon secara khusus :
Perilaku objek root default CloudFront berbeda dari perilaku dokumen indeks Amazon S3. Saat Anda mengonfigurasi bucket Amazon S3 sebagai situs web dan menentukan dokumen indeks, Amazon S3 mengembalikan dokumen indeks meskipun pengguna meminta subdirektori di bucket. (Salinan dokumen indeks harus muncul di setiap subdirektori.) Untuk informasi selengkapnya tentang mengonfigurasi bucket Amazon S3 sebagai situs web dan tentang dokumen indeks, lihat bab Situs Web Hosting di Amazon S3 di Panduan Pengembang Amazon Simple Storage Service.
Dengan demikian, meskipun Cloudfront memungkinkan kita menentukan objek root default, ini hanya berfungsi untuk www.example.com
dan bukan untuk www.example.com/subdir
. Untuk mengatasi kesulitan ini, kita dapat mengubah nama domain asal menjadi titik akhir situs web yang diberikan oleh S3. Ini berfungsi dengan baik dan memungkinkan objek root ditentukan secara seragam. Sayangnya, ini tampaknya tidak sesuai dengan identitas akses asal . Secara khusus, tautan di atas menyatakan:
Ubah ke mode edit:
Distribusi web - Klik tab Origins, klik origin yang ingin Anda edit, dan klik Edit. Anda hanya dapat membuat identitas akses asal untuk asal yang Jenis Asal adalah S3 Origin.
Pada dasarnya, untuk menyetel objek root default yang benar, kami menggunakan titik akhir situs web S3 dan bukan keranjang situs web itu sendiri. Ini tidak kompatibel dengan menggunakan identitas akses asal. Karena itu, pertanyaan saya bermuara pada keduanya
Apakah mungkin untuk menentukan objek root default untuk semua subdirektori untuk situs web yang dihosting secara statis di Cloudfront?
Apakah mungkin untuk menyiapkan identitas akses asal untuk konten yang disajikan dari Cloudfront yang asalnya adalah titik akhir situs web S3 dan bukan bucket S3?
Jawaban:
UPDATE: Sepertinya saya salah! Lihat jawaban JBaczuk, yang seharusnya menjadi jawaban yang diterima di utas ini.
Sayangnya, jawaban untuk kedua pertanyaan Anda adalah tidak.
1. Apakah mungkin untuk menentukan objek root default untuk semua subdirektori untuk situs web yang dihosting secara statis di Cloudfront?
Tidak. Seperti yang dinyatakan dalam dokumen AWS CloudFront ...
2. Apakah mungkin untuk menyiapkan identitas akses asal untuk konten yang disajikan dari Cloudfront yang asalnya adalah titik akhir situs web S3 dan bukan bucket S3?
Tidak secara langsung. Pilihan Anda untuk asal dengan CloudFront adalah bucket S3 atau server Anda sendiri.
Namun, opsi kedua itulah yang membuka beberapa kemungkinan menarik. Ini mungkin mengalahkan tujuan dari apa yang Anda coba lakukan, tetapi Anda dapat mengatur server Anda sendiri yang tugas satu-satunya adalah menjadi server asal CloudFront.
Saat permintaan masuk untuk http://d111111abcdef8.cloudfront.net/install/ , CloudFront akan meneruskan permintaan ini ke server asal Anda, meminta
/install
. Anda dapat mengonfigurasi server asal Anda sesuka Anda, termasuk untuk melayaniindex.html
dalam kasus ini.Atau Anda dapat menulis aplikasi web kecil yang hanya menerima panggilan ini dan tetap mendapatkannya langsung dari S3.
Tetapi saya menyadari bahwa menyiapkan server Anda sendiri dan mengkhawatirkan penskalaannya dapat menggagalkan tujuan dari apa yang Anda coba lakukan di tempat pertama.
sumber
Ada IS cara untuk melakukan hal ini. Alih-alih mengarahkannya ke keranjang Anda dengan memilihnya di tarik-turun (www.example.com.s3.amazonaws.com), arahkan ke domain statis keranjang Anda (mis. Www.example.com.s3-website-us -west-2.amazonaws.com):
Berkat utas Forum AWS ini
sumber
HTTPS
?Mengaktifkan hosting S3 berarti Anda harus membuka bucket ke dunia. Dalam kasus saya, saya perlu merahasiakan bucket dan menggunakan fungsionalitas identitas akses asal untuk membatasi akses ke Cloudfront saja. Seperti yang disarankan @Juissi, fungsi Lambda dapat memperbaiki pengalihan:
Setelah Anda memublikasikan fungsi Anda, buka distribusi cloudfront Anda di konsol AWS. Pergi ke
Behaviors
, lalu pilih diOrigin Request
bawahLambda Function Associations
, dan terakhir tempelkan ARN ke fungsi baru Anda.sumber
Ada satu cara lain untuk mendapatkan file default yang disajikan di subdirektori, seperti
example.com/subdir/
. Anda sebenarnya (secara terprogram) dapat menyimpan file dengan kuncisubdir/
di keranjang. File ini tidak akan muncul di konsol manajemen S3, tetapi sebenarnya ada, dan CloudFront akan menyajikannya.sumber
Solusi untuk masalah ini adalah dengan memanfaatkan lambda @ edge untuk menulis ulang permintaan. Anda hanya perlu menyiapkan lambda untuk acara permintaan penampil distribusi CloudFront dan menulis ulang semua yang diakhiri dengan '/' AND tidak sama dengan '/' dengan dokumen root default misalnya index.html.
sumber
Ada panduan "resmi" yang diterbitkan di blog AWS yang merekomendasikan pengaturan fungsi Lambda @ Edge yang dipicu oleh distribusi CloudFront Anda:
Ikuti panduan yang ditautkan di atas untuk melihat semua langkah yang diperlukan untuk menyiapkannya, termasuk bucket S3, distribusi CloudFront, dan pembuatan fungsi Lambda @ Edge .
sumber
Alternatif lain untuk menggunakan lambda @ edge adalah dengan menggunakan halaman kesalahan CloudFront. Siapkan Respons Kesalahan Kustom untuk mengirim semua 403 ke file tertentu. Kemudian tambahkan javascript ke file itu untuk menambahkan index.html ke url yang diakhiri dengan /. Kode sampel:
sumber
Saya tahu ini adalah pertanyaan lama, tetapi saya sendiri berjuang melalui ini sendiri. Pada akhirnya, tujuan saya bukanlah untuk menetapkan file default dalam direktori, dan lebih untuk mendapatkan hasil akhir dari file yang disajikan tanpa
.html
di akhir.Saya akhirnya menghapus
.html
dari nama file dan secara terprogram / manual mengatur jenis mime ketext/html
. Ini bukan cara tradisional, tetapi tampaknya berhasil, dan memenuhi persyaratan saya untuk url cantik tanpa mengorbankan manfaat cloudformation. Mengatur jenis pantomim memang menjengkelkan, tetapi harga yang kecil untuk membayar keuntungan menurut sayasumber