Amazon Cloudfront dengan S3. Akses ditolak

92

Kami mencoba membagikan bucket S3 melalui Cloudfront tetapi karena alasan tertentu satu-satunya respons adalah dokumen XML AccessDenied seperti berikut:

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

Berikut pengaturan yang kami gunakan:

Pengaturan Distribusi Pengaturan Asal

Dan ini kebijakan untuk ember

{
    "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
sumber
Pengaturan Perilaku Cache - imgur.com/JBZqrRm
Jordan Adams
Pastikan Cloudfront dapat membaca dari bucket S3.
Nathan C
Bagaimana saya mengaktifkan atau memeriksa ini?
Jordan Adams
Pengaturan asal, opsi terakhir. Lihat tangkapan layar Anda. :)
Nathan C
Saya pikir saya sudah mencoba ini sebelumnya dan tidak berhasil tetapi saya baru saja mengubahnya lagi dan sedang dalam proses distribusi. Saya akan menambahkan kebijakan ember ke pos saya :)
Jordan Adams

Jawaban:

93

Jika Anda mengakses root dari distribusi CloudFront Anda, Anda perlu mengatur objek root default: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Untuk menentukan objek root default menggunakan konsol CloudFront:

  • Masuk ke Konsol Manajemen AWS dan buka konsol Amazon CloudFront di https://console.aws.amazon.com/cloudfront/ .

  • Di daftar distribusi di panel atas, pilih distribusi untuk diperbarui.

  • Di panel Rincian Distribusi , pada tab Umum , klik Edit .

  • Di kotak dialog Edit Distribusi , di bidang Objek Root Default , masukkan nama file objek root default.

    Masukkan hanya nama objek, misalnya index.html,. Jangan menambahkan / sebelum nama objek.

  • Untuk menyimpan perubahan Anda, klik Ya, Edit .

Kousha
sumber
Dalam kasus saya, pengaturan ini belum menyelesaikan masalah. Saya masih mendapatkan kesalahan Akses Ditolak
KurioZ7
53

Saya baru saja mengalami masalah yang sama dan sementara jawaban Kousha memang memecahkan masalah untuk index.html di jalur root, masalah saya juga dengan sub-direktori ketika saya menggunakan yang dikombinasikan dengan index.html untuk mendapatkan "url cantik" (contoh .com / sesuatu / daripada "jelek" example.com/something.html)

Sebagian itu juga merupakan kesalahan Amazon, karena ketika Anda mengatur distribusi CloudFront, ia akan menawarkan Anda ember S3 untuk dipilih, tetapi jika Anda memilih salah satunya, itu akan menggunakan URL ember daripada URL hosting situs web statis sebagai backend.

Jadi untuk memperbaiki masalah:

  • Aktifkan hosting situs web statis untuk bucket
  • Atur dokumen Indeks (dan mungkin Kesalahan ) dengan tepat
  • Salin Endpoint URL - Anda dapat menemukannya di sebelah pengaturan di atas - Seharusnya terlihat seperti: <bucket.name> .s3-website- <aws-region> .amazonaws.com
  • Gunakan URL itu sebagai asal Distribusi CloudFront Anda. (Ini juga akan membuat pengaturan CF Default Root Object tidak perlu, tetapi tidak ada salahnya untuk mengaturnya)
Miroslav
sumber
Jawaban sempurna pada tanggal komentar ini.
Sai Ramachandran
Itu juga untuk saya. Saya sudah memiliki situs web lain yang berfungsi dan saya pikir saya mengkonfigurasi yang baru secara identik. Sangat mudah untuk mengabaikan ini.
Günther Eberl
Anda juga perlu menambahkan izin GetObject dan ListObjects publik ke bucket.
Georges
8

Saya memiliki masalah yang sama dengan @Cezz, meskipun solusinya tidak akan berfungsi dalam kasus saya.

Segera setelah hosting situs web statis diaktifkan untuk bucket, itu berarti pengguna dapat mengakses konten baik melalui URL Cloudfront, atau URL S3, yang tidak selalu diinginkan. Sebagai contoh, dalam kasus saya, distribusi Cloudfront diaktifkan SSL, dan pengguna tidak dapat mengaksesnya melalui koneksi non-SSL.

Solusi yang saya temukan adalah:

  • biarkan hosting situs web statis dinonaktifkan pada bucket S3
  • menjaga asal distribusi Cloudfront sebagai ID S3
  • set "Batasi Akses Bucket" ke "Ya" (dan untuk memudahkannya, izinkan CloudFront untuk secara otomatis memperbarui kebijakan bucket)
  • pada "Halaman Kesalahan", buat respons khusus, dan kode kesalahan peta "403: Dilarang" ke halaman respons yang diinginkan yaitu /index.html, dengan kode respons 200

Perhatikan bahwa dalam kasus saya, saya melayani aplikasi javascript satu halaman di mana semua jalur diselesaikan oleh index.html. Jika Anda memiliki jalur yang menyelesaikan ke objek yang berbeda di bucket S3 Anda, ini tidak akan berfungsi.

Jonny Green
sumber
1
Terima kasih atas jawaban anda. Yang ini berhasil untuk saya. Saya memiliki masalah yang sama seperti Anda. Saya tidak ingin orang-orang mengakses bucket S3 saya, jadi saya perlu membatasi akses ke Origin S3, yang hanya berfungsi ketika Anda mengisi asal seperti yang disarankan oleh lengkapi-otomatis di Cloudfront. Satu catatan tambahan, Anda tidak perlu menonaktifkan hosting situs web statis. Cukup menghapus kebijakan bucket yang memungkinkan akses publik sudah cukup.
Torsten
Ini sangat membantu, pesan terlarang berasal dari S3 yang awalnya tidak saya sadari, jadi Anda harus menangkapnya dengan halaman kesalahan khusus agar SPA Anda berfungsi.
Ivan
4

Dalam kasus saya, saya menggunakan beberapa asal-usul dengan "Pola Path" Perilaku bersama dengan Path Asal dalam ember S3 saya:

Penyiapan yang buruk:

Perilaku CloudFront: /images/*->My-S3-origin

My-S3-origin: Path Asal: /images

File S3: /images/my-image.jpg

DAPATKAN Permintaan: /images/my-image.jpg -> 403

Apa yang terjadi adalah seluruh permintaan CloudFront GET dikirimkan ke asal: /image/my-image.jpgdiawali oleh Origin Path:, /imagessehingga permintaan ke S3 sepertinya /images/images/my-image.jpgtidak ada.

Larutan

hapus Path Asal.

Ini memungkinkan saya untuk mengakses bucket dengan identitas akses asal dan izin bucket serta izin file individual dibatasi.

Scott Jungwirth
sumber
1

Dalam kasus saya, saya salah mengonfigurasi Rute 53. Saya telah membuat Alias ​​di domain saya tetapi mengarahkannya ke S3 Bucket alih-alih distribusi CloudFront.

Saya juga menghapus objek root default. Konsol dapat benar-benar ditingkatkan jika mereka menambahkan sedikit informasi ke teks tanda tanya tentang konsekuensi potensial dari menghilangkannya.

toon81
sumber