Amazon Cloudfront พร้อม S3 ปฏิเสธการเข้าใช้


91

เราพยายามแจกจ่าย S3 S3 ผ่าน Cloudfront แต่ด้วยเหตุผลบางอย่างคำตอบเดียวคือเอกสาร AccessDenied XML ดังต่อไปนี้:

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

นี่คือการตั้งค่าที่เราใช้:

การตั้งค่าการกระจาย การตั้งค่ากำเนิด

และนี่คือนโยบายสำหรับที่เก็บข้อมูล

{
    "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/*"
        }
    ]
}

การตั้งค่าพฤติกรรมแคช - imgur.com/JBZqrRm
Jordan Adams

ตรวจสอบให้แน่ใจว่า Cloudfront สามารถอ่านได้จากที่เก็บ S3
นาธาน C

ฉันจะเปิดใช้งานหรือตรวจสอบสิ่งนี้ได้อย่างไร
Jordan Adams

การตั้งค่าแหล่งกำเนิดตัวเลือกสุดท้าย ดูภาพหน้าจอของคุณ :)
นาธาน C

ฉันคิดว่าฉันลองมาก่อนหน้านี้และมันใช้ไม่ได้ แต่ฉันเพิ่งเปลี่ยนใหม่อีกครั้งและอยู่ในขั้นตอนการแจกจ่าย ฉันจะเพิ่มนโยบายถังที่จะโพสต์ของฉัน :)
จอร์แดนอดัมส์

คำตอบ:


91

หากคุณเข้าถึงรูทของการแจกจ่าย CloudFront ของคุณคุณจะต้องตั้งค่าออบเจ็กต์รูทเริ่มต้น: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

ในการระบุวัตถุรูทเริ่มต้นโดยใช้คอนโซล CloudFront:

  • เข้าสู่ระบบคอนโซลการจัดการ AWS และเปิดคอนโซล Amazon CloudFront ที่https://console.aws.amazon.com/cloudfront/

  • ในรายการการกระจายในบานหน้าต่างด้านบนให้เลือกการแจกจ่ายที่จะอัปเดต

  • ในรายละเอียดการจัดจำหน่ายบานหน้าต่างด้านบนทั่วไปแท็บคลิกแก้ไข

  • ในกล่องโต้ตอบแก้ไขการแจกจ่ายในฟิลด์วัตถุรูทเริ่มต้นให้ป้อนชื่อไฟล์ของวัตถุรูทเริ่มต้น

    ตัวอย่างเช่นป้อนชื่อวัตถุindex.htmlเท่านั้น ห้ามเพิ่ม / ก่อนชื่อวัตถุ

  • เพื่อบันทึกการเปลี่ยนแปลงของคุณให้คลิกใช่แก้ไข


ในกรณีของฉันการตั้งค่านี้ไม่สามารถแก้ไขปัญหาได้ ฉันยังคงได้รับข้อผิดพลาดการปฏิเสธการเข้าถึง
KurioZ7

53

ฉันเพิ่งมีปัญหาเดียวกันและในขณะที่คำตอบของ Kousha จะแก้ปัญหาสำหรับindex.htmlในรูทพา ธ ปัญหาของฉันก็มีไดเรกทอรีย่อยด้วยเช่นกันเมื่อฉันใช้ที่รวมกับindex.htmlเพื่อรับ "URL สวย" (ตัวอย่าง .com / บางสิ่ง / แทนที่จะเป็น "ugly" example.com/something.html)

ส่วนหนึ่งเป็นความผิดของ Amazon เช่นกันเพราะเมื่อคุณตั้งค่าการกระจาย CloudFront มันจะให้ S3 S3 ถังให้คุณเลือก แต่ถ้าคุณเลือกอย่างใดอย่างหนึ่งมันจะใช้ URL ถังแทนที่จะเป็น URL เว็บไซต์คงที่โฮสติ้งเป็นแบ็กเอนด์

ดังนั้นเพื่อแก้ไขปัญหา:

  • เปิดใช้งานการโฮสต์เว็บไซต์แบบคงที่สำหรับที่ฝากข้อมูล
  • ตั้งค่าเอกสารดัชนี (และอาจผิดพลาด ) อย่างเหมาะสม
  • คัดลอกURL ปลายทาง - คุณสามารถค้นหาได้ถัดจากการตั้งค่าด้านบน - ควรมีลักษณะดังนี้: <bucket.name> .s3-website- <aws-region> .amazonaws.com
  • ใช้ URL นั้นเป็นจุดกำเนิดการกระจาย CloudFront ของคุณ (สิ่งนี้จะทำให้การตั้งค่ารูทวัตถุ CF เริ่มต้นนั้นไม่จำเป็น แต่ไม่ได้ทำให้การตั้งค่านี้เสียหายเลย)

คำตอบที่สมบูรณ์แบบ ณ วันที่ในความคิดเห็นนี้
สายรามจันทรารัน

นั่นก็เพื่อฉันเช่นกัน ฉันมีเว็บไซต์อื่นทำงานอยู่แล้วและคิดว่าฉันได้กำหนดค่าเว็บไซต์ใหม่เหมือนกัน ง่ายมากที่จะมองข้ามสิ่งนี้
Günther Eberl

คุณต้องเพิ่มสิทธิ์ GetObject และ ListObjects สาธารณะให้กับที่ฝากข้อมูล
จอร์ชส

8

ฉันมีปัญหาเช่นเดียวกับ @Cezz ถึงแม้ว่าวิธีการแก้ปัญหาจะไม่ทำงานในกรณีของฉัน

ทันทีที่เปิดใช้งานการโฮสต์เว็บไซต์แบบคงที่สำหรับที่เก็บข้อมูลหมายความว่าผู้ใช้สามารถเข้าถึงเนื้อหาได้ผ่านทาง Cloudfront URL หรือ S3 URL ซึ่งไม่ต้องการเสมอไป ตัวอย่างเช่นในกรณีของฉันการกระจาย Cloudfront นั้นเปิดใช้งาน SSL และผู้ใช้ไม่ควรเข้าถึงผ่านการเชื่อมต่อที่ไม่ใช่ SSL

วิธีแก้ปัญหาที่ฉันพบคือ:

  • ปิดการใช้งานโฮสติ้งเว็บไซต์คงที่บนถัง S3
  • รักษาต้นกำเนิดการกระจาย Cloudfront เป็น S3 ID
  • ตั้งค่า "จำกัด การเข้าถึงถัง" เป็น "ใช่" (และเพื่อความสะดวกอนุญาตให้ CloudFront อัปเดตนโยบายถังข้อมูลโดยอัตโนมัติ)
  • ใน "หน้าข้อผิดพลาด" สร้างการตอบกลับที่กำหนดเองและรหัสข้อผิดพลาดแผนที่ "403: ห้าม" ไปยังหน้าการตอบสนองที่ต้องการเช่น /index.html ด้วยรหัสการตอบสนอง 200

โปรดทราบว่าในกรณีของฉันฉันให้บริการแอพพลิเคชั่นจาวาสคริปต์หน้าเดียวซึ่งเส้นทางทั้งหมดได้รับการแก้ไขโดย index.html หากคุณมีเส้นทางที่แก้ไขวัตถุต่าง ๆ ในที่เก็บข้อมูล S3 ของคุณสิ่งนี้จะไม่ทำงาน


1
ขอบคุณสำหรับคำตอบ. อันนี้ใช้ได้สำหรับฉัน ฉันมีปัญหาเช่นเดียวกับคุณ ฉันไม่ต้องการให้ผู้คนเข้าถึง S3 bucket ของฉันดังนั้นฉันจึงจำเป็นต้อง จำกัด การเข้าถึง S3 Origin ซึ่งใช้ได้เฉพาะเมื่อคุณกรอกที่มาตามคำแนะนำโดย auto-complete ใน Cloudfront แม้ว่าด้านหนึ่งคุณไม่จำเป็นต้องปิดใช้งานการโฮสต์เว็บไซต์แบบคงที่ เพียงแค่ลบนโยบายการฝากข้อมูลที่อนุญาตให้เข้าถึงสาธารณะได้อย่างเพียงพอ
Torsten

สิ่งนี้มีประโยชน์จริง ๆ ข้อความที่ต้องห้ามมาจาก S3 ซึ่งฉันไม่เคยรู้มาก่อนดังนั้นคุณต้องจับมันด้วยหน้าข้อผิดพลาดที่กำหนดเองเพื่อให้ SPA ของคุณทำงาน
อีวาน

4

ในกรณีของฉันฉันใช้ต้นกำเนิดหลายรายการที่มีพฤติกรรม "รูปแบบเส้นทาง" พร้อมกับเส้นทางต้นกำเนิดในที่เก็บข้อมูล S3 ของฉัน:

การตั้งค่าไม่ถูกต้อง:

พฤติกรรม CloudFront: /images/*->My-S3-origin

My-S3-origin: เส้นทางกำเนิด: /images

ไฟล์ S3: /images/my-image.jpg

รับคำขอ: /images/my-image.jpg -> 403

สิ่งที่เกิดขึ้นคือคำขอทั้งหมดของ CloudFront GET ถูกส่งไปที่จุดกำเนิด: /image/my-image.jpgนำหน้าด้วย Origin Path: /imagesดังนั้นคำขอใน S3 จึงดูเหมือนว่า/images/images/my-image.jpgไม่มีอยู่จริง

วิธีการแก้

ลบ Origin Path

สิ่งนี้ทำให้ฉันสามารถเข้าถึงที่ฝากข้อมูลโดยมีการระบุตัวตนการเข้าถึงต้นทางและสิทธิ์การฝากข้อมูลและสิทธิ์การเข้าถึงไฟล์แต่ละรายการที่ จำกัด


1

ในกรณีของฉันฉันได้กำหนดค่าเส้นทาง 53 ผิด ฉันสร้างนามแฝงบนโดเมนของฉันแล้วชี้ไปที่ S3 Bucket แทนการเผยแพร่ CloudFront

นอกจากนี้ฉันยังละเว้นวัตถุรูทเริ่มต้น คอนโซลอาจได้รับการปรับปรุงให้ดีขึ้นหากพวกเขาเพิ่มข้อมูลลงในข้อความเครื่องหมายคำถามเกี่ยวกับผลที่อาจเกิดขึ้นจากการข้ามไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.