Score:4

AWS: จะเปลี่ยนเส้นทางโดเมนจำนวนมากไปยังเพจในโดเมนอื่นได้อย่างไร

ธง us
ssc

วัตถุประสงค์ของฉัน

ฉันมีจำนวนโดเมน (เช่น 10 หรือ 20) และฉันต้องการเปลี่ยนเส้นทาง ใดๆ ผู้เยี่ยมชม ได้ทุกที่ ในหน้าเหล่านั้นไปยังหน้าหนึ่งในโดเมนอื่น (เช่น หน้าโปรไฟล์ stackoverflow.com ของฉัน)

ซึ่งรวมถึง

  1. เอเพ็กซ์โดเมนโดยใช้ http (เช่น. http://mydomain01.com)
  2. เอเพ็กซ์โดเมนโดยใช้ https (เช่น. https://mydomain01.com)
  3. โดเมนย่อยโดยใช้ http (เช่น. http://www.mydomain01.com หรือ http://blog.mydomain01.com)
  4. โดเมนย่อยโดยใช้ https (เช่น. https://www.mydomain01.com หรือ https://blog.mydomain01.com)
  5. ทุกเส้นทาง (เช่น http://mydomain01.com/some_path หรือ https://www.mydomain01.com/another/path.html)

บวกเหมือนกันสำหรับโดเมนอื่นๆ ทั้งหมดของฉัน (mydomain02.com, mydomain03.comฯลฯ; แต่ละกรณีการใช้งานข้างต้น)

งานวิจัยของฉัน

  1. บทความ AWS นี้ อธิบายวิธีเปลี่ยนเส้นทางการรับส่งข้อมูลทางอินเทอร์เน็ตจากโดเมน apex ไปยังโดเมนอื่น (กรณี #1 ใน my ซึ่งรวมถึง รายการด้านบน) โดยใช้ AWS S3 และ AWS เส้นทาง 53: สิ่งนี้ใช้ได้กับ httpแต่ไม่ใช่สำหรับ https.
  2. บทความ AWS นี้ อธิบายวิธีเปลี่ยนเส้นทางการรับส่งข้อมูลทางอินเทอร์เน็ตสำหรับหลายกรณี (โดยลักษณะแล้วครอบคลุมทุกกรณีใน my ซึ่งรวมถึง รายการด้านบน) โดยใช้ AWS S3, AWS เส้นทาง 53 และ AWS CloudFront: วิธีนี้ใช้ได้ทั้งสองอย่าง http และ https. (พูดถึงการใช้ Application Load Balancer ด้วย แต่ฉันเดาว่ามันเกินขอบเขตที่นี่ ... )
  3. บทความ AWS นี้ เพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าการแจกจ่าย CloudFront และวิธีรับข้อมูลเชิงลึกเกี่ยวกับไฟล์บันทึก
  4. บทความ AWS นี้ กฎการเปลี่ยนเส้นทางเอกสารเพื่อใช้การเปลี่ยนเส้นทางแบบมีเงื่อนไขขั้นสูง: ไม่แน่ใจว่าฉันต้องไปที่นั่นเพื่อให้บรรลุเป้าหมายหรือไม่ ดังนั้นยังไม่ได้ตรวจสอบจริงๆ

นอกจากนี้ยังมีคำถาม SO มากมายอย่างเห็นได้ชัด (ดู ที่เกี่ยวข้อง ทางด้านขวาของคำถามนี้) และข้อความอื่นๆ ในหัวข้อ; ปัญหาส่วนใหญ่คือพวกเขาใช้ภาพหน้าจอจาก AWS Console UI เวอร์ชันก่อนหน้า: เนื้อหาส่วนใหญ่ควรยังคงเหมือนเดิม แต่การเชื่อมโยงภาพหน้าจอเหล่านั้นกับ UI IMO ปัจจุบันจะเพิ่มความสับสนอีกชั้นหนึ่ง

ประเด็นสำคัญจากเอกสาร AWS (และอื่นๆ):

  1. ฉันต้องสร้างบัคเก็ตใน AWS S3 และกำหนดค่าการเปลี่ยนเส้นทางในนั้น
  2. ฉันต้องสร้างการกระจายใน AWS CloudFront;
  3. เพื่อใช้โดเมนแบบกำหนดเองใน CloudFront ฉันต้องสร้างใบรับรองใน AWS ACM
  4. ฉันต้องสร้างโซนที่โฮสต์ใน AWS Route 53 และกำหนดค่าบันทึกในนั้น

งานของฉันจนถึงตอนนี้

ติดตั้ง AWS CLI ล่าสุดแล้ว ภูมิภาค และ เอาต์พุต ได้รับการกำหนดค่าใน ~/.aws/config, ข้อมูลประจำตัวถูกตั้งค่าใน ~/.aws/ข้อมูลประจำตัว (แต่ละบัญชีสำหรับทุกบัญชี AWS); AWS_* ตัวแปรสภาพแวดล้อม เป็น ส่งออกเอ็ด

ฉันใช้ภูมิภาค AWS สหรัฐอเมริกาฝั่งตะวันออก (เวอร์จิเนียเหนือ) (us-east-1) สำหรับทุกอย่างเพื่อป้องกันปัญหาเพิ่มเติมที่เกิดจากทรัพยากร AWS ไม่พร้อมใช้งานในภูมิภาค

$aws --เวอร์ชั่น
aws-cli/2.2.23 Python/3.9.6 Darwin/19.6.0 source/x86_64 พรอมต์/ปิด

ฉันละเว้นการแจ้งของเชลล์หรือ > อักขระต่อเนื่องของบรรทัดเชลล์เพื่อการคัดลอกจากโพสต์นี้ไปยังเชลล์ได้ง่ายขึ้น

ตั้งค่าบัคเก็ต S3

คำเตือน: สิ่งนี้จะสร้างบัคเก็ต "สาธารณะทั้งหมด" โดยไม่มีข้อจำกัดในการเข้าถึง ในกรณีนี้ ไม่ควรสำคัญเนื่องจากไม่มีเนื้อหาในบัคเก็ตให้ป้องกัน แต่บัคเก็ตสาธารณะดังกล่าวถือเป็นแนวทางปฏิบัติที่ไม่ดีโดยทั่วไป นอกจากนี้ ฉันใช้บัคเก็ตสาธารณะเพื่อป้องกันปัญหาเพิ่มเติมที่เกิดจากการจำกัดการเข้าถึง: ขั้นแรก ทำให้มันใช้งานได้ ประการที่สองทำให้ปลอดภัย.

สร้างถัง

aws s3api สร้างที่ฝากข้อมูล --bucket mydomain01.com
  • การตอบสนอง:
{
    "ตำแหน่ง": "/mydomain01.com"
}

ตั้งค่าการเปลี่ยนเส้นทาง

aws s3api เว็บไซต์ put-bucket --bucket mydomain01.com --website-configuration \
    '{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
  • ไม่มีการตอบสนอง

Gotcha: ชื่อบัคเก็ต S3 ต้องตรงกับชื่อโดเมนเอเพ็กซ์

ใช้ชื่อฝากข้อมูลใด ๆ แต่ mydomain01.com (สำหรับตัวอย่างของฉัน) ดูเหมือนจะล้มเหลวโดยไม่มีข้อบ่งชี้ถึงสาเหตุ เอกสาร AWS ไม่ได้ทำให้ชัดเจนมากนัก อันที่จริง ฉันยังไม่แน่ใจว่าฉันเข้าใจอะไรผิดไปมากหรือเปล่า แต่จากสิ่งที่ฉันบอกได้ เอกสารอย่างเป็นทางการของ AWS นั้นค่อนข้างเลอะเทอะในเรื่องนั้น - IMO - ประเด็นสำคัญที่สำคัญ : ตัวอย่างเช่น, #2 เพียงแค่พูดว่า

  1. สร้างบัคเก็ต S3 ด้วยชื่อเฉพาะส่วนกลาง

ซึ่งอาจจะเป็น ใดๆ ชื่อเฉพาะทั่วโลก #1 กล่าวถึงสิ่งนั้น - เมื่อคุณรู้วิธีอ่านบิตเหล่านั้นแล้ว ...

บทความ #2 นั้นยังคงสร้างความสับสนให้กับฉัน

หากคุณไม่ได้ใช้โดเมนแบบกำหนดเอง ...

ทำไมฉันถึง ไม่ ใช้โดเมนที่กำหนดเองหรือไม่!? ประเด็นทั้งหมดคือการเปลี่ยนเส้นทางโดเมนที่กำหนดเองของฉันใช่ไหม!? ยังไงก็ตาม...

Gotcha: ต้องไม่นำหน้าโปรโตคอลเป็นชื่อโฮสต์

ทั้ง AWS Console และ AWS CLI ดูเหมือนจะไม่ทดสอบว่าโปรโตคอล (http:// หรือ https://) ถูกป้อนใน ชื่อโฮสต์ ฟิลด์ UI / ส่งผ่านใน ชื่อโฮสต์ สตริง JSON อย่างไรก็ตาม หากมีการเพิ่มเข้ามา การเปลี่ยนเส้นทางจะล้มเหลว ดู ทดสอบการเปลี่ยนเส้นทาง ด้านล่าง.

Gotcha: ข้อบกพร่อง UI ของคอนโซล AWS S3

หลังจากตั้งค่าการเปลี่ยนเส้นทางแล้ว คอนโซล AWS จะแสดงลิงก์ที่คลิกได้ใน UI ไปยัง URL ที่ฝากข้อมูล (http://mydomain01.com.s3-website-us-east-1.amazonaws.com) ที่ด้านล่างสุดของถัง คุณสมบัติ แท็บ ใน โฮสติ้งเว็บไซต์คงที่ ส่วน.

การคลิกลิงก์นั้นไม่สามารถเปิดหน้าได้ อาจเป็นเพราะ AWS Console ทำให้ URL ยุ่งเหยิงและพยายามเปิด http://https//stackoverflow.com/users/217844/ssc/ไม่ว่าโปรโตคอล

ทดสอบการเปลี่ยนเส้นทาง

  • โดยใช้ HTTPie ในเปลือกแทน ขด หรือ ว้าว เพราะนั่นคือสิ่งที่เด็กเท่ๆใช้กันในปัจจุบัน
  • คัดลอกลิงก์จาก AWS Console ในเบราว์เซอร์ไปยังเชลล์
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 ย้ายอย่างถาวร
ความยาวเนื้อหา: 0
วันที่: จันทร์ 02 ส.ค. 2564 12:39:09 น. GMT
ที่ตั้ง: http://stackoverflow.com/users/217844/ssc/
เซิร์ฟเวอร์: AmazonS3
x-amz-id-2: rakAqUMnRraGvo/WkSa6AnbuhWn/9YZX/CAlI/OJQKYoWp/OdQIbyhsvHSwNved3suwMdgglqpE=
x-amz-request-id: C5BBG833Q9TQ9J6X

--> ดูเหมือนจะได้ผล

  • ทดสอบการเปลี่ยนเส้นทางหากโปรโตคอลถูกต่อท้ายชื่อโฮสต์อย่างไม่ถูกต้อง สังเกตหัก ที่ตั้ง URL:
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 ย้ายอย่างถาวร
ความยาวเนื้อหา: 0
วันที่: จันทร์ 02 ส.ค. 2564 12:52:10 GMT
ที่ตั้ง: http://https://stackoverflow.com/users/217844/ssc/
เซิร์ฟเวอร์: AmazonS3
x-amz-id-2: Ee2/ob0faTpRdp6mGITdmClozXNmF1Q2oTbPioms8O91VA8n5VA3MoHhveeFz7v2VS65YKFKlDA=
x-amz-request-id: ZJP653R50YD5HSRS

คำถามของฉัน #1

หมายเหตุ: ฉันมีคำถามเหล่านี้เมื่อเริ่มเขียนสิ่งนี้ ฉัน คิด ฉันสามารถตอบพวกเขาได้เองตั้งแต่ (ดู ทดสอบ www บันทึกโดเมนย่อย ด้านล่าง). ใครก็ได้โปรดแก้ไขฉันถ้าฉันผิด:

  1. ถาม: ข้อกำหนด "ชื่อฝากข้อมูล == ชื่อโดเมน" มีผลบังคับใช้แม้ว่าฉันจะใช้ CloudFront หรือไม่
    ตอบ: ใช่.
  2. ถาม: ฉันจำเป็นต้องสร้างที่ฝากข้อมูลอย่างละหนึ่งแห่งสำหรับโดเมนเอเพ็กซ์และทุกโดเมนย่อยหรือไม่ ในตัวอย่างของฉัน
    • mydomain01.com
    • www.mydomain01.com
    • blog.mydomain01.com ?
      ตอบ: ใช่.

ตั้งค่าโซนที่โฮสต์บนเส้นทาง 53

สร้างโซนโฮสต์

aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
  • การตอบสนอง
{
    "สถานที่": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z123456789EXAMPLE0SKX",
    "โซนโฮสต์": {
        "รหัส": "/hostedzone/Z123456789EXAMPLE0SKX",
        "ชื่อ": "mydomain01.com",
        "การอ้างอิงผู้โทร": "20210802-150736",
        "กำหนดค่า": {
            "PrivateZone": เท็จ
        },
        "ResourceRecordSetCount": 2
    },
    "ข้อมูลการเปลี่ยนแปลง": {
        "รหัส": "/change/C1234567890SKXEXAMPLE",
        "สถานะ": "รอดำเนินการ",
        "SubmittedAt": "2021-08-02T13:07:37.860000+00:00"
    },
    "ชุดการมอบหมาย": {
        "เนมเซิร์ฟเวอร์": [
            "ns-1234.awsdns-12.com",
            "ns-5678.awsdns-34.co.uk",
            "ns-1234.awsdns-56.net",
            "ns-5678.awsdns-78.org"
        ]
    }
}
  • จดบันทึก ID โซนที่โฮสต์ Z123456789EXAMPLE0SKXที่จำเป็นในขั้นตอนต่อไป

สร้างระเบียนสำหรับโดเมนเอเพ็กซ์

{
  "การเปลี่ยนแปลง": [
    {
      "การกระทำ": "สร้าง",
      "ResourceRecordSet": {
        "ชื่อ": "mydomain01.com",
        "ประเภท": "ก",
        "AliasTarget": {
          "HostedZoneId": "Z3AQBSTGFYJSTF",
          "ชื่อ DNS": "s3-website-us-east-1.amazonaws.com",
          "EvaluateTargetHealth": เท็จ
        }
      }
    }
  ]
}

Gotcha: ต้องใช้คำต่อคำ s3-เว็บไซต์-us-east-1.amazonaws.com สำหรับ ชื่อ DNS.

เอกสาร AWS พูดคุยในทุกที่เกี่ยวกับ ตัวอย่าง.คอม หรือ example.com.s3-website-us-east-1.amazonaws.comฯลฯ ในกรณีนี้ นี่ไม่ใช่ตัวอย่างที่จะถูกแทนที่ด้วยค่าของตัวเอง (เช่น mydomain01.com.s3-website-us-east-1.amazonaws.com), แต่ ค่าคำต่อคำจาก ตาราง, เช่น. s3-เว็บไซต์-us-east-1.amazonaws.com.

Gotcha: ต้องไม่นำหน้าโปรโตคอลเป็นชื่อโฮสต์

เช่นเดียวกับ gotcha ด้านบน ทั้ง AWS Console และ AWS CLI ยินดีรับโปรโตคอล (http:// หรือ https://) ต่อท้ายค่าที่ป้อนใน ชื่อโฮสต์ ฟิลด์ UI / ส่งผ่านเป็น ชื่อ DNS. อย่างน้อยก็มีลักษณะนี้ มาก ผิดใน Console เช่น http\072\057\057mydomain01.s3-website-us-east-1.amazonaws.com

gotchas ทั้งสองจะถูกลดทอนลงเล็กน้อยใน AWS Console ซึ่งสามารถเลือกค่าได้จากกล่องดรอปดาวน์เมื่อสร้างหรือแก้ไขเรกคอร์ด เมื่อใช้ AWS CLI คุณต้องตรวจสอบสิ่งที่คุณส่งอีกครั้ง

gotcha และ mitigation เดียวกันนี้ใช้กับ ชื่อบันทึก ฟิลด์ UI / ชื่อ ค่า JSON

สร้างระเบียนสำหรับโดเมนเอเพ็กซ์ ต่อ

  • ใช้ เจคิว สำหรับการทดสอบอย่างรวดเร็วไฟล์ temp มี json ที่ถูกต้อง
จค. < change-batch.apex.json 1> /dev/null
  • ไม่มีเอาต์พุต -> JSON ที่ถูกต้อง
aws route53 เปลี่ยนทรัพยากรบันทึกชุด --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "ไฟล์://$(pwd)/change-batch.apex.json"
  • การตอบสนอง
{
    "ข้อมูลการเปลี่ยนแปลง": {
        "รหัส": "/change/C1234567890EXAMPLESKX",
        "สถานะ": "รอดำเนินการ",
        "ส่งเมื่อ": "2021-08-02T14:20:09.370000+00:00"
    }
}

ทดสอบบันทึกโดเมนเอเพ็กซ์

  • ทดสอบ http
http http://mydomain01.com
HTTP/1.1 301 ย้ายอย่างถาวร
ความยาวเนื้อหา: 0
วันที่: จันทร์ 02 ส.ค. 2564 15:06:08 GMT
ที่ตั้ง: http://stackoverflow.com/users/217844/ssc/
เซิร์ฟเวอร์: AmazonS3
x-amz-id-2: EfDtCxif2iV4eInskirSBAOjQS7o9arzJCeZjscF6mW7cwwmm9Nxb7QJT50x2kjdslX2fOxA+lk=
x-amz-request-id: WM7K9TDEF75A6P1V

--> ดูดี

  • ทดสอบ http ด้วยเส้นทาง
http http://mydomain01.com/some/path
 ... เอาต์พุตคล้ายกับด้านบน ...
  • ทดสอบ https
http https://mydomain01.com

http: ข้อผิดพลาด: ConnectionError: HTTPSConnectionPool (host='mydomain01.com', port=443):
  เกินจำนวนการลองใหม่สูงสุดด้วย url: / (เกิดจาก NewConnectionError('<urllib3.connection.HTTPSConnection วัตถุที่ 0x101a48100>:
    สร้างการเชื่อมต่อใหม่ไม่สำเร็จ: [Errno 60] การดำเนินการหมดเวลา')) ขณะทำการร้องขอ GET ไปยัง URL: https://mydomain01.com/
  • (ห่อคำตอบเพื่อให้อ่านง่าย)

--> หมดเวลา (หลังจาก 60 วินาที ?) - ตามที่คาดไว้: การเปลี่ยนเส้นทางโดยใช้บัคเก็ต S3 ไม่สามารถใช้งานได้ https (ดูด้านบน)

Gotcha: ความล่าช้าในการเผยแพร่การเปลี่ยนแปลง DNS

AWS และ Google คือ มาก รวดเร็วในแง่ของการเผยแพร่การเปลี่ยนแปลงการตั้งค่า DNS (เป็นวินาทีหรือนาที) แต่อาจมีเซิร์ฟเวอร์ชื่ออื่นที่ "ช้ากว่า" ที่เกี่ยวข้อง ข้ามพวกเขาตามที่อธิบายไว้ ที่นี่ เพื่อกำจัดแหล่งที่มาของความสับสนนั้น วิธีการดังกล่าวใช้ได้เฉพาะใน macOS แต่แนวคิดนี้เหมือนกันสำหรับระบบปฏิบัติการใดๆ

Gotcha: แคชของเบราว์เซอร์

เมื่อทดสอบการเปลี่ยนแปลง DNS ไม่ได้อยู่ในเชลล์ แต่อยู่ในเบราว์เซอร์ เบราว์เซอร์อาจได้รับผลลัพธ์จากแคช ฉันทำงานส่วนใหญ่โดยใช้ Chrome แต่ใช้ Firefox (หรือ Safari) ในการทดสอบ ดังนั้นฉันจึงสามารถล้างแคชทั้งหมดก่อนการทดสอบทุกครั้งเพื่อขจัดปัญหาที่อาจเกิดขึ้น - โดยไม่ต้องออกจากระบบ Google, AWS ฯลฯ

สร้างบันทึกสำหรับ www โดเมนย่อย

  • ข้อแตกต่างเพียงอย่างเดียวคือ ชื่อ ค่า JSON
sed -e 's|mydomain01.com.|www.mydomain01.com.|g' change-batch.apex.json > change-batch.www.json
aws route53 เปลี่ยนทรัพยากรบันทึกชุด --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.www.json
  • การตอบสนองคล้ายกับข้างต้น

ทดสอบ www บันทึกโดเมนย่อย

  • ทดสอบ http
http http://www.mydomain01.com
ไม่พบ HTTP/1.1 404
ความยาวเนื้อหา: 363
ประเภทเนื้อหา: text/html; ชุดอักขระ=utf-8
วันที่: จันทร์ 02 ส.ค. 2564 15:28:05 GMT
เซิร์ฟเวอร์: AmazonS3
x-amz-id-2: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=
x-amz-request-id: TK83G35EMYFR8SKX

<html>
<head><title>ไม่พบ 404</title></head>
<เนื้อหา>
<h1>404 ไม่พบ</h1>
<ul>
<li>รหัส: NoSuchBucket</li>
<li>ข้อความ: ไม่มีที่เก็บข้อมูลที่ระบุ</li>
<li>BucketName: www.mydomain01.com</li>
<li>RequestId: TK83G35EMYFR8SKX</li>
<li>HostId: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=</li>
</ul>
<ชม/>
</body>
</html>
  • ฉันคิดว่าคำตอบที่สองของ คำถามของฉัน #1 ด้านบน: ฉันต้องการที่ฝากข้อมูล S3 หนึ่งถังต่อเอเพ็กซ์/โดเมนย่อยเพื่อส่งต่อ

ตั้งค่าการกระจาย CloudFront

  • หมายเหตุ: AWS Console ทำให้มันง่ายมาก ขอใบรับรอง และตรวจสอบโดยใช้ DNS

สร้างใบรับรอง

  • AWS ACM ขอใบรับรอง เอกสาร
  • ใบรับรองควรจะใช้ได้กับเอเพ็กซ์และโดเมนย่อยทั้งหมด ดังนั้นจึงจำเป็นต้องทำ เพิ่มชื่ออื่นในใบรับรองนี้ / ผ่าน --subject-ชื่อทางเลือก; ดู บทความ AWS นี้ (กล่องสีฟ้าด้านบน).
  • เพิ่มคำพูดรอบ ๆ *.mydomain01.com ดังนั้นเชลล์จึงไม่ตีความ *
aws acm ขอใบรับรอง --domain-name mydomain01.com --validation-method DNS \
    --subject-ชื่อทางเลือก '*.mydomain01.com'
  • การตอบสนอง:
{
    "CertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab"
}
  • 123456789012 คือ ID บัญชี AWS ของฉัน ทุกอย่างหลังจากนั้น ใบรับรอง/ เป็นเพียง UUID

รับรายละเอียดใบรับรอง

  • AWS ACM อธิบายใบรับรอง เอกสาร
  • บันทึกการตอบสนองต่อไฟล์ในเครื่องชั่วคราว สารสกัด ResourceRecord.Name และ ResourceRecord.Value โดยใช้ เจคิว
  • จำเป็นสำหรับบันทึก AWS Route 53 ที่พิสูจน์ว่าฉันเป็นเจ้าของ mydomain01.com
  • หรือใช้ --สอบถาม พารามิเตอร์ด้วย aws acm อธิบายใบรับรอง
aws acm อธิบายใบรับรอง \
    --certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab" \
 > อธิบายใบรับรอง json
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Name' อธิบายใบรับรอง json
_1234567890abcdef1234567890abcdef.mydomain01.com

jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Value' อธิบายใบรับรอง json 
_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws

สร้างบันทึกเส้นทาง 53 สำหรับการตรวจสอบใบรับรอง

  • จะถูกตรวจสอบโดยอัตโนมัติโดย AWS ACM และใบรับรองจะได้รับการตรวจสอบเมื่อพบบันทึกนี้
  • เหมือนเดิม ให้ใช้ไฟล์ในเครื่องชั่วคราว change-batch.cert.jsonดูเช่น สร้างระเบียนสำหรับโดเมนเอเพ็กซ์; เนื้อหา:
{
  "การเปลี่ยนแปลง": [
    {
      "การกระทำ": "สร้าง",
      "ResourceRecordSet": {
        "ชื่อ": "_1234567890abcdef1234567890abcdef.mydomain01.com",
        "ประเภท": "CNAME",
        "TTL": 300,
        "บันทึกทรัพยากร": [
          {
            "ค่า": "_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws"
          }
        ]
      }
    }
  ]
}
  • คำสั่งเชลล์:
aws route53 เปลี่ยนทรัพยากรบันทึกชุด --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.cert.json
  • การตอบสนองคล้ายกับเมื่อสร้างบันทึกด้านบน
  • หมายเหตุ: อาจใช้เวลาสองสามนาทีเพื่อให้ ACM ตรวจสอบใบรับรอง

สร้างการกระจาย CloudFront

  • AWS CloudFront สร้างการกระจาย เอกสาร
  • อีกครั้ง, การอ้างอิงผู้โทร ต้องเป็นสตริงเฉพาะ ใช้เช่น วันที่ '+%Y%m%d-%H%M%S' ในเชลล์เพื่อสร้างและคัดลอกลงในไฟล์ ดู สร้างโซนโฮสต์
  • เหมือนเดิม ให้ใช้ไฟล์ในเครื่องชั่วคราว create-distribution.json สำหรับค่าที่ซับซ้อน เนื้อหาด้านล่าง
  • เวอร์ชันโปรโตคอลขั้นต่ำ: รับค่าจาก บทความ AWS นี้
  • นโยบายโปรโตคอลต้นทาง: โดยใช้ http-เท่านั้น เพราะต้นทาง (ที่ฝากข้อมูล S3) ทำได้เท่านั้น http
  • นโยบายผู้ดูโปรโตคอล: โดยใช้ เปลี่ยนเส้นทางไปยัง https เนื่องจากจุดรวมของการสร้างการแจกจ่ายนี้คือการเปลี่ยนเส้นทางจาก http ถึง https
  • หมายเหตุ: ฉันไม่รู้ (และเอกสาร AWS ไม่ได้บอก) ฟิลด์ใดที่จำเป็นอย่างยิ่ง คำสั่ง AWS CLI จะแสดงข้อความที่ชัดเจนและมีรายละเอียด หากมีบางอย่างเกี่ยวกับข้อมูลที่ส่งขาดหายไปหรือผิดพลาด
{
    "การอ้างอิงผู้โทร": "20210802-191725",
    "นามแฝง": {
        "ปริมาณ": 2,
        "รายการ": ["mydomain01.com", "*.mydomain01.com"]
    },
    "ต้นทาง": {
        "ปริมาณ": 1,
        "รายการ": [
            {
                "รหัส": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
                "ชื่อโดเมน": "mydomain01.com.s3.us-east-1.amazonaws.com",
                "CustomOriginConfig": {
                    "พอร์ต HTTP": 80,
                    "HTTPSPort": 443,
                    "OriginProtocolPolicy": "http-only"
                }
            }
        ]
    },
    "กลุ่มต้นทาง": {
        "ปริมาณ": 0
    },
    "พฤติกรรมแคชเริ่มต้น": {
        "TargetOriginId": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
        "ค่าที่ส่งต่อ": {
            "QueryString": เท็จ
            "คุ้กกี้": {
                "ส่งต่อ": "ไม่มี"
            },
            "ส่วนหัว": {
                "ปริมาณ": 0
            },
            "QueryStringCacheKeys": {
                "ปริมาณ": 0
            }
        },
        "ผู้ลงนามที่เชื่อถือได้": {
            "เปิดใช้งาน": เท็จ
            "ปริมาณ": 0
        },
        "ViewerProtocolPolicy": "เปลี่ยนเส้นทางไปยังhttps",
        "MinTTL": 0,
        "AllowedMethods": {
            "ปริมาณ": 2,
            "รายการ": [
                "ศีรษะ",
                "รับ"
            ]
            "CachedMethods": {
                "ปริมาณ": 2,
                "รายการ": [
                    "ศีรษะ",
                    "รับ"
                ]
            }
        },
        "การสตรีมที่ราบรื่น": เท็จ
        "ค่าเริ่มต้น TTL": 86400,
        "MaxTTL": 31536000,
        "บีบอัด": เท็จ
        "สมาคมฟังก์ชันแลมบ์ดา": {
            "ปริมาณ": 0
        },
        "FieldLevelEncryptionId": ""
    },
    "พฤติกรรมแคช": {
        "ปริมาณ": 0
    },
    "CustomErrorResponses": {
        "ปริมาณ": 0
    },
    "ความคิดเห็น": "",
    "การบันทึก": {
        "เปิดใช้งาน": เท็จ
        "รวมคุกกี้": เท็จ
        "ถัง": "",
        "คำนำหน้า": ""
    },
    "ระดับราคา": "ราคาคลาส_ทั้งหมด",
    "เปิดใช้งาน": จริง
    "ใบรับรองผู้ดู": {
        "ACMCertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab",
        "MinimumProtocolVersion": "TLSv1.2_2021",
        "SSLSupportMethod": "sni-only"
    },
    "ข้อ จำกัด": {
        "ข้อจำกัดทางภูมิศาสตร์": {
            "RestrictionType": "ไม่มี",
            "ปริมาณ": 0
        }
    },
    "WebACLId": "",
    "httpVersion": "http2",
    "IsIPV6Enabled": จริง
}
  • คำสั่งเชลล์:
  • หมายเหตุ: เพิ่ม --no-cli-เพจเจอร์ เพื่อปิดใช้งานการเพจและจัดเก็บการตอบสนองในไฟล์ในเครื่องชั่วคราวสำหรับการตรวจสอบ
aws --no-cli-pager cloudfront สร้างการกระจาย \
    --distribution-config "ไฟล์://$(pwd)/create-distribution.json"
 > create-distribution.response.json
  • การตอบสนอง: โครงสร้าง JSON ขนาดใหญ่ ส่วนใหญ่เป็นการกำหนดค่าที่ส่งมาพร้อมกับข้อมูลเมตาการแจกจ่าย

Gotcha: การกระจาย CloudFront ใช้เวลาสักครู่ในการปรับใช้

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

การกระจายการทดสอบ

  • รับ ชื่อโดเมน จากการตอบสนอง
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
  • ทดสอบ http
http http://abcdefghij1234.cloudfront.net
HTTP/1.1 301 ย้ายอย่างถาวร
การเชื่อมต่อ: มีชีวิตอยู่
ความยาวเนื้อหา: 183
ประเภทเนื้อหา: text/html
วันที่: จันทร์ 02 ส.ค. 2564 20:14:27 GMT
ที่ตั้ง: https://abcdefghij1234.cloudfront.net/
เซิร์ฟเวอร์: CloudFront
ผ่าน: 1.1 8640a37b586353bc916562c577770223.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ooT0Y1QvDE7_yoRmb0p0Un2Db6O713rBvudtmz1xer7YwEU0GE8smw==
X-Amz-Cf-ป๊อป: HAM50-C2
X-Cache: เปลี่ยนเส้นทางจาก cloudfront

<html>
<head><title>301 ย้ายอย่างถาวร</title></head>
<ตัว bgcolor="สีขาว">
<center><h1>301 ย้ายอย่างถาวร</h1></center>
<hr><center>คลาวด์ฟรอนต์</center>
</body>
</html>

ดังนั้นการกระจายเปลี่ยนเส้นทางจาก http://abcdefghij1234.cloudfront.net ถึง https://abcdefghij1234.cloudfront.net - เท่าที่ควร นั่นคือสิ่งที่มันถูกสร้างขึ้นสำหรับ

  • ทดสอบ https
HTTP/1.1 403 ถูกห้าม
การเชื่อมต่อ: มีชีวิตอยู่
ประเภทเนื้อหา: application/xml
วันที่: จันทร์ 02 ส.ค. 2564 20:14:35 GMT
เซิร์ฟเวอร์: AmazonS3
การเข้ารหัสการถ่ายโอน: chunked
ผ่าน: 1.1 c3e656776c8a9f0e1ea24405ab1dcc85.cloudfront.net (CloudFront)
X-Amz-Cf-Id: or4SC8urWEv_8c3jDURv5IINwFU1TDVLSQ3_X7tya7Ncz8ujyz0-IQ==
X-Amz-Cf-ป๊อป: HAM50-C2
X-Cache: ข้อผิดพลาดจาก cloudfront
x-amz-bucket-ภูมิภาค: เรา-ตะวันออก-1

<?xml version="1.0" encoding="UTF-8"?>
<ข้อผิดพลาด>
  <Code>AccessDenied</Code>
  <ข้อความ>การเข้าถึงถูกปฏิเสธ</ข้อความ>
  <RequestId>EAST1CM5WJR8QM3S</RequestId>
  <HostId>zF2dJm2vsuSM633NHuzcA5VqrCrNkfYGu31FRmKKIkebuI5+6l5DlVnr4kk9be262hcqktoiROw=</HostId>
</ข้อผิดพลาด>
  • (จัดรูปแบบ xml เพื่อให้อ่านง่าย)

ที่ดูไม่ดี ไม่แน่ใจว่าจะเป็นไปตามคาดหรือไม่!?

อัปเดตบันทึก AWS Route 53

  • เปลี่ยนจากการใช้บัคเก็ต S3 เป็นการใช้การกระจาย CloudFront
  • เหมือนเดิม ให้สร้างไฟล์ในเครื่องชั่วคราว change-batch.apex.updatejson โดย เสดing ไฟล์ก่อนหน้า change-batch.apex.json
  • ใช้ อัพเซิร์ต แทน สร้าง: บันทึกนี้มีอยู่แล้วและต้องอัปเดต
  • รหัสโซนโฮสต์: แทนที่ค่าเก่า Z3AQBSTGFYJSTF (สำหรับ S3) โดย Z2FDTNDATAQYW2ค่าเวทมนตร์บางอย่างนำมาจาก เปลี่ยนทรัพยากรบันทึกชุด เอกสาร
  • ชื่อ DNS:อ้างจาก เปลี่ยนทรัพยากรบันทึกชุด เอกสาร

ระบุชื่อโดเมนที่ CloudFront กำหนดเมื่อคุณสร้างการกระจายของคุณ

การกระจาย CloudFront ของคุณต้องมีชื่อโดเมนสำรองที่ตรงกับชื่อของชุดระเบียนทรัพยากร ตัวอย่างเช่น หากชื่อของชุดระเบียนทรัพยากรคือ acme.example.com การกระจาย CloudFront ของคุณต้องมี acme.example.com เป็นหนึ่งในชื่อโดเมนสำรอง

--> แทนที่ s3-เว็บไซต์-us-east-1.amazonaws.com (สำหรับ S3) โดย abcdefghij1234.cloudfront.net:

sed -e 's|สร้าง|UPSERT|g' \
    -e 's|Z3AQBSTGFYJSTF|Z2FDNDATAQYW2|g' \
    -e 's|s3-website-us-east-1.amazonaws.com|abcdefghij1234.cloudfront.net|g' \
    change-batch.apex.json > change-batch.apex.update.json
  • เนื้อหาไฟล์:
{
  "การเปลี่ยนแปลง": [
    {
      "การกระทำ": "UPSERT",
      "ResourceRecordSet": {
        "ชื่อ": "mydomain01.com",
        "ประเภท": "ก",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "ชื่อ DNS": "abcdefghij1234.cloudfront.net",
          "EvaluateTargetHealth": เท็จ
        }
      }
    }
  ]
}
  • คำสั่งเชลล์
aws route53 เปลี่ยนแปลงทรัพยากรบันทึกชุด \
    --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "ไฟล์://$(pwd)/change-batch.apex.update.json"
  • การตอบสนองคล้ายกับเมื่อสร้างบันทึกด้านบน

ทดสอบบันทึกโดเมนเอเพ็กซ์

  • ทดสอบ http
http http://mydomain01.com
HTTP/1.1 301 ย้ายอย่างถาวร
การเชื่อมต่อ: มีชีวิตอยู่
ความยาวเนื้อหา: 183
ประเภทเนื้อหา: text/html
วันที่: จันทร์ 02 ส.ค. 2564 19:08:27 GMT
ที่ตั้ง: https://mydomain01.com/
เซิร์ฟเวอร์: CloudFront
ผ่าน: 1.1 2408979685aa1bdb752824d292e63bf7.cloudfront.net (CloudFront)
X-Amz-Cf-Id: Ww60Ol_0fdR8SsgcHeRYUd_de1rVejX6w_wuK80aR21e3IHstB-irA==
X-Amz-Cf-ป๊อป: HAM50-C2
X-Cache: เปลี่ยนเส้นทางจาก cloudfront

<html>
<head><title>301 ย้ายอย่างถาวร</title></head>
<ตัว bgcolor="สีขาว">
<center><h1>301 ย้ายอย่างถาวร</h1></center>
<hr><center>คลาวด์ฟรอนต์</center>
</body>
</html>
  • ตอนนี้การตอบสนองมาจาก CloudFront และไม่ได้มาจาก S3 อีกต่อไป ดังนั้นระเบียน DNS ที่อัปเดตจึงดูเหมือนว่าจะใช้งานได้ :-)
  • ทดสอบ http ด้วยเส้นทาง
http http://mydomain01.com/some/path
 ... เอาต์พุตคล้ายกับด้านบน ...

--> ดูดี

  • ทดสอบ https
http https://mydomain01.com
HTTP/1.1 403 ถูกห้าม
การเชื่อมต่อ: มีชีวิตอยู่
ประเภทเนื้อหา: application/xml
วันที่: จันทร์ 02 ส.ค. 2564 18:53:51 GMT
เซิร์ฟเวอร์: AmazonS3
การเข้ารหัสการถ่ายโอน: chunked
ผ่าน: 1.1 ea89c67081222c8c680e7a37ad75f4f0.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 5prv5_g5zXOX3aRBp2Gq64JJPuwC2o5dHIp9RCAHm6Ls8hK6EFghXw==
X-Amz-Cf-ป๊อป: HAM50-C2
X-Cache: ข้อผิดพลาดจาก cloudfront
x-amz-bucket-ภูมิภาค: เรา-ตะวันออก-1

<?xml version="1.0" encoding="UTF-8"?>
<ข้อผิดพลาด>
  <Code>AccessDenied</Code>
  <ข้อความ>การเข้าถึงถูกปฏิเสธ</ข้อความ>
  <RequestId>T78ASF3FA9QGV4T5</RequestId>
  <HostId>xaEgwEtbeesL4XfxMdxVoPAt9Lpb1ZDM9Fs5W4htBbcWNbV9sMUTjVAPIuWwAQ3Xh1yRhh4b4Ts=</HostId>
</ข้อผิดพลาด>
  • (เช่นเดิม จัดรูปแบบ xml เพื่อให้อ่านง่าย)

หมายเหตุ: คำตอบนี้มาจาก AmazonS3ไม่ใช่จาก คลาวด์ฟรอนท์ เช่นเดียวกับก่อนหน้านี้ บัคเก็ต S3 ไม่มีการจำกัดการเข้าถึงใดๆ ทั้งสิ้น ดังนั้นจะมีได้อย่างไร ปฏิเสธการเข้าใช้ ?!?

ตรวจสอบสิทธิ์ถังอีกครั้ง

aws s3api get-bucket-policy --bucket mydomain01.com

เกิดข้อผิดพลาด (NoSuchBucketPolicy) เมื่อเรียกการดำเนินการ GetBucketPolicy: ไม่มีนโยบายที่ฝากข้อมูล

ที่ตรงกับความว่าง นโยบายฝากข้อมูล ฟิลด์ในคอนโซล AWS S3 - แต่จริง ๆ แล้วไม่มีนโยบายฝากข้อมูลเลยเหรอ!?

ตอนนี้มองย้อนกลับไปที่ การกระจายการทดสอบ ข้างต้น ผมเห็นว่าการตอบสนองการเข้าถึง abcdefghij1234.cloudfront.net มาจาก S3 โดยตรง ไม่ใช่จาก CloudFront ดังนั้นปัญหาจึงค่อนข้างชัดเจน:

คำถามของฉัน #2

  1. เหตุใดที่ฝากข้อมูล S3 จึงปฏิเสธการเข้าถึง
  2. เป็นเรื่องปกติหรือไม่ที่บัคเก็ต S3 จะไม่มีนโยบายการเข้าถึงเลย ? มักจะไม่มีนโยบายที่เก็บข้อมูล "สาธารณะ" ที่อนุญาตให้ทุกคนเข้าถึงได้อย่างชัดเจน ?
  3. คล้ายกับ หนึ่งฝากข้อมูล S3 ต่อเอเพ็กซ์ / โดเมนย่อยฉันต้องการการแจกจ่าย CloudFront หนึ่งรายการต่อโดเมนเอเพ็กซ์ / ย่อยด้วยหรือไม่
  4. ถ้าเป็นเช่นนั้นฉันคิดว่าการเพิ่ม *.mydomain01.com เนื่องจากโดเมนสำรองสำหรับใบรับรอง (และการแจกจ่าย) ไม่สมเหตุสมผลเลยใช่ไหม!? ฉันยังต้องการหนึ่งใบรับรองต่อการแจกจ่าย เฉพาะสำหรับหนึ่งโดเมน ใช่ไหม ?
Marcin avatar
es flag
ที่ฝากข้อมูลของคุณต้องเป็นสาธารณะหรือคุณต้องใช้ผู้ใช้ OAI เพื่อเข้าถึง CF
Score:1
ธง mx

คุณมาถูกทางแล้วโดยทั่วไป เพียงความคิดเห็นเดียว: คุณสามารถละเว้น Route53 ได้หากโดเมนของคุณใช้ผู้ให้บริการ DNS รายอื่นอยู่แล้ว

ถาม: ข้อกำหนด "ชื่อบัคเก็ต == ชื่อโดเมน" มีผลบังคับใช้แม้ว่าฉันจะใช้ CloudFront หรือไม่

ไม่ หากคุณใช้ CloudFront CNAME ได้รับการกำหนดค่าแยกต่างหากใน CloudFront

ถาม: ฉันต้องสร้างที่ฝากข้อมูลอย่างละหนึ่งแห่งสำหรับโดเมนเอเพ็กซ์และทุกโดเมนย่อยหรือไม่

ไม่ คุณไม่จำเป็นต้องใช้ที่เก็บข้อมูลหนึ่งชุดต่อโดเมน/โดเมนย่อย

เหตุใดที่ฝากข้อมูล S3 จึงปฏิเสธการเข้าถึง

คุณควรใช้ของคุณ s3-เว็บไซต์-us-east-1.amazonaws.com โดเมนเป็นแหล่งกำเนิด CF

เป็นเรื่องปกติหรือไม่ที่บัคเก็ต S3 จะไม่มีนโยบายการเข้าถึงเลย ? มักจะไม่มีนโยบายที่เก็บข้อมูล "สาธารณะ" ที่อนุญาตให้ทุกคนเข้าถึงได้อย่างชัดเจน ?

หากคุณใช้ที่ฝากข้อมูลเพียงเพื่อเปลี่ยนเส้นทางการรับส่งข้อมูล นโยบายการเข้าถึงไม่ควรใช้

เช่นเดียวกับที่ฝากข้อมูล S3 หนึ่งถังต่อเอเพ็กซ์ / โดเมนย่อย ฉันจำเป็นต้องมีการแจกจ่าย CloudFront หนึ่งรายการต่อเอเพ็กซ์ / โดเมนย่อยด้วยหรือไม่

ใช่ คุณต้องมีการกระจาย CloudFront หนึ่งรายการต่อโดเมน/โดเมนย่อย เนื่องจากการกระจายหนึ่งรายการสามารถแนบใบรับรอง ACM ได้สูงสุดหนึ่งรายการ

ถ้าเป็นเช่นนั้นฉันคิดว่าการเพิ่ม *.mydomain01.com เนื่องจากโดเมนสำรองสำหรับใบรับรอง (และการแจกจ่าย) ไม่สมเหตุสมผลเลยใช่ไหม!? ฉันยังต้องการหนึ่งใบรับรองต่อการแจกจ่าย เฉพาะสำหรับหนึ่งโดเมน ใช่ไหม ?

การเพิ่มโดเมนไวด์การ์ดนั้นสมเหตุสมผลเนื่องจากการแจกจ่าย CF จำเป็นต้องจัดการทราฟฟิกโดเมนย่อยด้วย

หากคุณมีคำถามเพิ่มเติม โปรดเข้าร่วม แชท AWS และ @ ฉันในแชท

ar flag
หมายเหตุ AWS Console UI อัตโนมัติแนะนำให้ใช้รูปแบบ บทความบอกว่าจะใช้เช่นกัน: https://aws.amazon.com/premiumsupport/knowledge-center/route-53-redirect-to-another-domain/ > จดบันทึกจุดสิ้นสุดของบัคเก็ต (example.com.s3-website-us-east-1.amazonaws.com) คุณจะใช้ข้อมูลนี้เพื่อกำหนดค่าชื่อโดเมนต้นทางสำหรับ CloudFront ในงานต่อไปนี้
jellycsc avatar
mx flag
@Tony-Caffe สายดี!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา