วัตถุประสงค์ของฉัน
ฉันมีจำนวนโดเมน (เช่น 10 หรือ 20) และฉันต้องการเปลี่ยนเส้นทาง ใดๆ ผู้เยี่ยมชม ได้ทุกที่ ในหน้าเหล่านั้นไปยังหน้าหนึ่งในโดเมนอื่น (เช่น หน้าโปรไฟล์ stackoverflow.com ของฉัน)
ซึ่งรวมถึง
- เอเพ็กซ์โดเมนโดยใช้ 
http (เช่น. http://mydomain01.com) 
- เอเพ็กซ์โดเมนโดยใช้ 
https (เช่น. https://mydomain01.com) 
- โดเมนย่อยโดยใช้ 
http (เช่น. http://www.mydomain01.com หรือ http://blog.mydomain01.com) 
- โดเมนย่อยโดยใช้ 
https (เช่น. https://www.mydomain01.com หรือ https://blog.mydomain01.com) 
- ทุกเส้นทาง (เช่น 
http://mydomain01.com/some_path หรือ https://www.mydomain01.com/another/path.html) 
บวกเหมือนกันสำหรับโดเมนอื่นๆ ทั้งหมดของฉัน (mydomain02.com, mydomain03.comฯลฯ; แต่ละกรณีการใช้งานข้างต้น)
งานวิจัยของฉัน
- บทความ AWS นี้ อธิบายวิธีเปลี่ยนเส้นทางการรับส่งข้อมูลทางอินเทอร์เน็ตจากโดเมน apex ไปยังโดเมนอื่น (กรณี #1 ใน my ซึ่งรวมถึง รายการด้านบน) โดยใช้ AWS S3 และ AWS เส้นทาง 53: สิ่งนี้ใช้ได้กับ 
httpแต่ไม่ใช่สำหรับ https. 
- บทความ AWS นี้ อธิบายวิธีเปลี่ยนเส้นทางการรับส่งข้อมูลทางอินเทอร์เน็ตสำหรับหลายกรณี (โดยลักษณะแล้วครอบคลุมทุกกรณีใน my ซึ่งรวมถึง รายการด้านบน) โดยใช้ AWS S3, AWS เส้นทาง 53 และ AWS CloudFront: วิธีนี้ใช้ได้ทั้งสองอย่าง 
http และ https. (พูดถึงการใช้ Application Load Balancer ด้วย แต่ฉันเดาว่ามันเกินขอบเขตที่นี่ ... ) 
- บทความ AWS นี้ เพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าการแจกจ่าย CloudFront และวิธีรับข้อมูลเชิงลึกเกี่ยวกับไฟล์บันทึก
 
- บทความ AWS นี้ กฎการเปลี่ยนเส้นทางเอกสารเพื่อใช้การเปลี่ยนเส้นทางแบบมีเงื่อนไขขั้นสูง: ไม่แน่ใจว่าฉันต้องไปที่นั่นเพื่อให้บรรลุเป้าหมายหรือไม่ ดังนั้นยังไม่ได้ตรวจสอบจริงๆ
 
นอกจากนี้ยังมีคำถาม SO มากมายอย่างเห็นได้ชัด (ดู ที่เกี่ยวข้อง ทางด้านขวาของคำถามนี้) และข้อความอื่นๆ ในหัวข้อ; ปัญหาส่วนใหญ่คือพวกเขาใช้ภาพหน้าจอจาก AWS Console UI เวอร์ชันก่อนหน้า: เนื้อหาส่วนใหญ่ควรยังคงเหมือนเดิม แต่การเชื่อมโยงภาพหน้าจอเหล่านั้นกับ UI IMO ปัจจุบันจะเพิ่มความสับสนอีกชั้นหนึ่ง
ประเด็นสำคัญจากเอกสาร AWS (และอื่นๆ):
- ฉันต้องสร้างบัคเก็ตใน AWS S3 และกำหนดค่าการเปลี่ยนเส้นทางในนั้น
 
- ฉันต้องสร้างการกระจายใน AWS CloudFront;
 
- เพื่อใช้โดเมนแบบกำหนดเองใน CloudFront ฉันต้องสร้างใบรับรองใน AWS ACM
 
- ฉันต้องสร้างโซนที่โฮสต์ใน 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 เพียงแค่พูดว่า
- สร้างบัคเก็ต 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 บันทึกโดเมนย่อย ด้านล่าง). ใครก็ได้โปรดแก้ไขฉันถ้าฉันผิด:
- ถาม: ข้อกำหนด "ชื่อฝากข้อมูล == ชื่อโดเมน" มีผลบังคับใช้แม้ว่าฉันจะใช้ CloudFront หรือไม่
ตอบ: ใช่. 
- ถาม: ฉันจำเป็นต้องสร้างที่ฝากข้อมูลอย่างละหนึ่งแห่งสำหรับโดเมนเอเพ็กซ์และทุกโดเมนย่อยหรือไม่ ในตัวอย่างของฉัน
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://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://mydomain01.com/some/path
 ... เอาต์พุตคล้ายกับด้านบน ...
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://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://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 - เท่าที่ควร นั่นคือสิ่งที่มันถูกสร้างขึ้นสำหรับ
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://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
 ... เอาต์พุตคล้ายกับด้านบน ...
--> ดูดี
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
- เหตุใดที่ฝากข้อมูล S3 จึงปฏิเสธการเข้าถึง
 
- เป็นเรื่องปกติหรือไม่ที่บัคเก็ต S3 จะไม่มีนโยบายการเข้าถึงเลย ? มักจะไม่มีนโยบายที่เก็บข้อมูล "สาธารณะ" ที่อนุญาตให้ทุกคนเข้าถึงได้อย่างชัดเจน ?
 
- คล้ายกับ หนึ่งฝากข้อมูล S3 ต่อเอเพ็กซ์ / โดเมนย่อยฉันต้องการการแจกจ่าย CloudFront หนึ่งรายการต่อโดเมนเอเพ็กซ์ / ย่อยด้วยหรือไม่
 
- ถ้าเป็นเช่นนั้นฉันคิดว่าการเพิ่ม 
*.mydomain01.com เนื่องจากโดเมนสำรองสำหรับใบรับรอง (และการแจกจ่าย) ไม่สมเหตุสมผลเลยใช่ไหม!? ฉันยังต้องการหนึ่งใบรับรองต่อการแจกจ่าย เฉพาะสำหรับหนึ่งโดเมน ใช่ไหม ?