วัตถุประสงค์ของฉัน
ฉันมีจำนวนโดเมน (เช่น 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
เนื่องจากโดเมนสำรองสำหรับใบรับรอง (และการแจกจ่าย) ไม่สมเหตุสมผลเลยใช่ไหม!? ฉันยังต้องการหนึ่งใบรับรองต่อการแจกจ่าย เฉพาะสำหรับหนึ่งโดเมน ใช่ไหม ?