การใช้งาน | ความปลอดภัย | บันทึกการเปลี่ยนแปลง | ภาคผนวก
(อัลฟ่า) เครื่องมือที่ช่วยเขียนไซต์แบบคงที่ด้วย Amazon Web Services (AWS)
เหตุผล : ไซต์แบบคงที่เป็นเรื่องสนุก การปรับใช้ S3 ถือเป็นความสุขอย่างแท้จริง CloudFront ทำการปรับขนาดสิ่งที่คุณไม่คิดอีกต่อไป ไม่มีเซิร์ฟเวอร์ให้ดูแล ไม่มีน้ำตาให้ร้องไห้ การตั้งค่าทั้งหมดนั้นไม่ใช่เรื่องตรงไปตรงมา Confetti คือความพยายามในการเข้ารหัสแนวทางปฏิบัติที่ดีที่สุดในโปรแกรมที่ทำซ้ำได้โดยใช้ CloudFormation และมอบเครื่องมือที่มีประโยชน์สำหรับสถานการณ์การปรับใช้ขั้นพื้นฐานและขั้นสูง
[confetti/confetti " 0.2.1 " ] ; ; latest release
การสร้างเว็บไซต์ | กำลังซิงค์ไซต์ของคุณ | ขั้นตอนสุดท้าย: dns | การเพิ่มโดเมนย่อย
Confetti ถูกบรรจุเป็นงานบูต สาเหตุหลักมาจากการบูตทำให้ง่ายต่อการเขียนแอปบรรทัดคำสั่งใน Clojure โดยไม่จำเป็นต้องกังวลเกี่ยวกับการบูตสแตรปหรือการแก้ปัญหาการพึ่งพา
Confetti จัดเตรียมคำสั่งสองคำสั่งใน Boot-lingo ที่เรียกว่า งาน งาน create-site
จะสร้างสแต็ก CloudFormation พร้อมทรัพยากรทั้งหมดสำหรับเว็บไซต์คงที่ของคุณและบันทึกข้อมูลสำคัญทั้งหมดลงในไฟล์ EDN ในไดเรกทอรีปัจจุบัน
มาดูตัวอย่างการสร้างไซต์และการซิงค์เป็นครั้งแรก
สับสนเกี่ยวกับคีย์การเข้าถึงใช่ไหม ตรวจสอบส่วนความปลอดภัยของ README นี้
สมมติว่าคุณต้องการปรับใช้ไซต์ที่ my-app.com
หากต้องการสร้างบัคเก็ต S3 การแจกจ่าย CloudFront และคีย์การเข้าถึงแบบจำกัด คุณสามารถเรียกใช้สิ่งต่อไปนี้:
boot -d confetti create-site --domain "my-app.com" --access-key XXX --secret-key YYY
หมายเหตุ: บิต
-d confetti
ทำให้แน่ใจว่า Boot จะดาวน์โหลดลูกปา ดังนั้นงานcreate-site
จะพร้อมใช้งาน
ข้อยกเว้น! เนื่องจากคุณต้องการใช้โดเมนเปล่า/APEX คุณจึงต้องใช้ Route53 สำหรับ DNS (คุณสามารถดูข้อมูลเพิ่มเติมได้ในภาคผนวก) ลองอีกครั้งโดยเปิดใช้งาน DNS:
boot -d confetti create-site --domain "my-app.com" --access-key XXX --secret-key YYY --dns
นี่ควรเป็นการเริ่มต้นกระบวนการ ข้อเสนอแนะแรกควรปรากฏบนหน้าจอของคุณ ในบางจุดจะไม่มีการพิมพ์กิจกรรมใหม่ แต่กระบวนการก็ยังไม่กลับมา สิ่งที่คุณกำลังรออยู่ตอนนี้คือการสร้างการกระจาย CloudFront ของคุณ โดยปกติจะใช้เวลาประมาณ 10-15 นาที
คุณสามารถฆ่ากระบวนการได้ ณ จุดนี้ ทุกอย่างทำงานจากระยะไกลและจะไม่ถูกรบกวน ไฟล์
.confetti.edn
จะถูกบันทึกไว้ในไดเร็กทอรีการทำงานปัจจุบันของคุณ และหากใช้งานfetch-outputs
โดยมีข้อมูลประจำตัวเพียงพอ คุณสามารถดาวน์โหลดข้อมูลที่เป็นประโยชน์ทั้งหมดได้ตลอดเวลา (งานจะบอกคุณว่าสแต็กยังไม่พร้อมเช่นกัน)
หลังจากงาน create-site
เสร็จสิ้น คุณควรค้นหาไฟล์ในไดเร็กทอรีการทำงานปัจจุบันของคุณ: my-app-com.confetti.edn
เนื้อหาควรมีทุกสิ่งที่สำคัญเกี่ยวกับทรัพยากรที่คุณจัดเตรียมใหม่:
{ :stack-id " arn:aws:cloudformation:us-east-1:297681564547:stack/my-app-com/xxx " ,
:bucket-name " my-app-com-sitebucket-3fu0w0729ndk " ,
:cloudfront-id " E3760XUWU2V9R7 " ,
:cloudfront-url " d3up0oy7r2svli.cloudfront.net " ,
:access-key " AAA " ,
:secret-key " BBB " ,
:website-url " http://my-app.com " ,
:hosted-zone-id " Z3KJWNUJTT8GHO " }
ตอนนี้ทุกอย่างพร้อมสำหรับการปรับใช้ครั้งแรกแล้ว!
ตอนนี้งาน sync-bucket
เข้ามามีบทบาทแล้ว แม้ว่างานนี้จะมีวิธีการต่างๆ มากมายในการระบุสิ่งที่จะอัปโหลด แต่เราจะแสดงวิธีที่ง่ายที่สุดที่นี่: การซิงค์ไดเร็กทอรีในเครื่อง เพื่อจุดประสงค์ในการสาธิตของเรา ให้สร้างไดเร็กทอรีอย่างรวดเร็ว:
mkdir my-app-site
echo "Hello World" > my-app-site/index.html
echo "About Us" > my-app-site/about.html
ตอนนี้มาซิงค์กัน นำค่า bucket-name
, access-key
และ secret-key
จากไฟล์ .confetti.edn :
boot -d confetti sync-bucket --bucket "my-app-com-sitebucket-3fu0w0729ndk"
--access-key AAA --secret-key BBB --dir my-app-site
;; or alternatively
boot -d confetti sync-bucket --confetti-edn your-site.confetti.edn --dir my-app-site
การดำเนินการนี้จะอัปโหลด index.html
และ about.html
ไปยังที่เก็บข้อมูลของคุณ เพื่อตรวจสอบว่าทุกอย่างสำเร็จ คุณสามารถนำทางไปยัง URL ที่จัดเก็บเป็น cloudfront-url
ในไฟล์ edn
มีหลายวิธีในการระบุไฟล์ที่จะอัปโหลด (พร้อมข้อมูลเมตาที่กำหนดเอง หากต้องการ) ซึ่งไม่ครอบคลุมอยู่ในคู่มือนี้ ปรึกษา
boot sync-bucket --help
เพื่อดูรายละเอียด
ตอนนี้ขั้นตอนเดียวที่ขาดหายไปคือการตั้งค่า DNS อย่างถูกต้อง สิ่งที่ต้องทำที่นี่จะแตกต่างกันไปขึ้นอยู่กับว่าคุณเปิดใช้งานตัวเลือก --dns
หรือไม่ ในตัวอย่างด้านบน เราเปิดใช้งาน ดังนั้นให้ครอบคลุมกรณีนั้นก่อน:
DNS พร้อม Route53: เนื่องจากคุณมีการตั้งค่าโดเมน root/naked/apex คุณจึงตัดสินใจใช้ DNS ที่จัดการโดย AWS ตอนนี้ คุณต้องตั้งค่าเนมเซิร์ฟเวอร์สำหรับโดเมนที่คุณใช้กับเนมเซิร์ฟเวอร์ของ AWS สิ่งเหล่านี้จะแตกต่างกันไปตาม Hosted Zone ที่แตกต่างกัน ดังนั้นคุณจึงต้องค้นหาใน AWS Console
หากไม่มี Route53: เมื่อไม่ได้ใช้ Route53 สิ่งเดียวที่คุณต้องทำคือเพิ่มรายการ CNAME ให้กับ Zonefile ของโดเมนของคุณที่ชี้ไปยังการกระจาย Cloudfront
ขั้นตอนทั้งสองนี้จะแตกต่างกันไปในแต่ละผู้รับจดทะเบียนโดเมน ดังนั้นจึงขอแนะนำให้ตรวจสอบเอกสารประกอบของแต่ละราย
ต้องการ SSL หรือไม่? ต่อไปนี้เป็นวิธีเปิดใช้งาน
สมมติว่าคุณใช้ Confetti เพื่อสร้างไซต์ weloveparens.com
และตอนนี้ต้องการเพิ่มไซต์แบบคงที่ลงในโดเมนย่อยของโดเมนนั้น คุณก็สามารถวิ่งได้:
boot create-site --domain "shop.weloveparens.com" --dns --access-key FOO --secret-key BAR
สิ่งนี้จะสร้าง Route53 RecordSet ใน HostedZone ซึ่งสร้างไว้ก่อนหน้านี้สำหรับคุณเมื่อตั้งค่า weloveparens.com
บัคเก็ต S3, การแจกจ่าย CloudFront และอื่นๆ จะถูกสร้างขึ้นตามปกติ และเช่นเคย ทุกอย่าง (รวมถึง RecordSet) จะถูกสร้างขึ้นเป็นสแต็ก CloudFormation ดังนั้นหากคุณไม่ต้องการมันอีกต่อไป คุณก็แค่ลบสแต็กนั้นออก โดยปล่อยให้ weloveparens.com
ไม่ได้รับผลกระทบใดๆ
หากต้องการรับความช่วยเหลือเกี่ยวกับบรรทัดคำสั่ง คุณสามารถเรียกใช้ได้ตลอดเวลา:
boot create-site --help
boot fetch-outputs --help
boot sync-bucket --help
นอกจากนี้อย่าลังเลที่จะเปิดประเด็นเพื่อถามคำถามหรือเสนอแนะการปรับปรุง
การให้คีย์ AWS ของคุณแก่บางโปรแกรมและปล่อยให้มันทำงานไปด้วยนั้นค่อนข้างจะน่ากลัว ดังนั้นส่วนนี้จึงมุ่งเป้าไปที่การให้ความสะดวกสบายในเรื่องนั้น
create-site
จะสร้างสแต็ก CloudFormation ตามเทมเพลตที่กำหนดไว้ใน confetti-clj/cloudformation--dry-run
ได้create-site
ต้องมีสิทธิ์ในการสร้างทรัพยากรแต่ละรายการที่แสดงอยู่ในเทมเพลต CloudFormation (ในอนาคต Confetti อาจจัดเตรียมส่วนย่อยนโยบาย AWS IAM เพื่อให้คุณสามารถสร้างผู้ใช้ที่มีสิทธิ์ทั้งหมดที่ Confetti ต้องการ) ในเวอร์ชัน 0.2.0
คำสั่ง create-site
จะสร้างไฟล์ที่ลงท้ายด้วย .confetti.edn
ซึ่งมีข้อมูลทั้งหมดที่จำเป็นในการดูแลรักษาไซต์ของคุณ ข้อมูลในไฟล์นี้มีความลับ!
อัปเดต: ฉันได้ข้อสรุปว่าการสร้างไฟล์นี้เป็นความคิดที่ไม่ดี ผู้คนจะยอมรับและเผยแพร่คีย์ไปยังบัคเก็ต S3 ของตนอย่างหลีกเลี่ยงไม่ได้ ในอนาคตฉันอยากจะพิมพ์บางอย่างในรูปแบบที่ direnv เข้าใจและแนะนำ env vars / direnv แทน
[confetti/cloudformation "0.1.6"]
ซึ่งมีการปรับปรุงต่อไปนี้:confetti/s3-deploy
เพื่อปรับปรุงความเข้ากันได้ของ Windows การใช้ HostedZone ซ้ำ: การสร้าง HostedZone ใหม่สำหรับแต่ละไซต์มีข้อเสียสองประการ:
การใช้ HostedZone หนึ่งอันสำหรับโดเมนรากของคุณ example.com
ปัญหาเหล่านี้จะได้รับการแก้ไข และการเพิ่มไซต์ใหม่ที่ demo.example.com
เป็นเพียงเรื่องของการเพิ่ม RecordSet เท่านั้น ตอนนี้ Confetti พยายามค้นหา HostedZone ที่มีอยู่ และเพิ่ม RecordSet หากพบเท่านั้น
ตัวเลือก invalidation-paths
ใหม่สำหรับงาน sync-bucket
เส้นทางที่ใช้ไม่ได้ก่อนหน้านี้ถูกกำหนดโดยอิงจากไฟล์ที่คุณอัปโหลด ตอนนี้คุณสามารถจัดเตรียมชุดแบบกำหนดเองได้แล้ว (#21 + #29)
แก้ไขข้อบกพร่องด้วยวิธีใหม่ในการจัดหาตัวเลือกผ่านไฟล์ .confetti.edn
confetti-edn
ตอนนี้เรายอมรับทั้งสองเวอร์ชันแล้ว (ลงท้ายด้วย .confetti.edn
และเฉพาะส่วนที่ก่อนหน้านั้น) ก่อนหน้านี้ คาดว่าคุณจะระบุเฉพาะชิ้นส่วนก่อนส่วนต่อท้าย .confetti.edn
เท่านั้นconfetti-edn
และงาน fetch-outputs
create-site
fetch-outputs
[confetti/cloudformation "0.1.3"]
เพื่อให้มี :website-url
ในเอาต์พุตสแต็กไม่ว่าจะใช้ Route53 หรือไม่ก็ตามfetch-outputs
หากไม่ได้ใช้ Route53 fetch-outputs
ซึ่งสามารถใช้เพื่อดาวน์โหลดเอาต์พุตของสแต็ก Cloudformation ได้ ก่อนหน้านี้การรายงานมักจะค้างและบันทึกเอาต์พุตสแต็กไม่ถูกต้อง เพื่อหลีกเลี่ยงปัญหานี้ คุณสามารถยกเลิกการรายงานและเรียก fetch-outputs
ในภายหลังเพื่อดาวน์โหลดเอาต์พุตได้sync-bucket
ขณะนี้มีตัวเลือก confetti-edn
ที่สามารถใช้เพื่อจัดหาบางส่วน id ของ {some-id}.confetti.edn
ข้อมูลในไฟล์นั้นจะถูกนำมาใช้แทนตัวเลือกงานปกติหากมีสิ่งใดไม่ทำงานตามที่คาดไว้ โปรดเปิดปัญหา -
หมายเหตุ หากคุณได้รับข้อผิดพลาด 504 เมื่อขอเนื้อหาจากการแจกจ่าย Cloudfront ของคุณ ให้ตรวจสอบอีกครั้งว่าคุณใช้ตำแหน่งข้อมูลเว็บไซต์เป็นจุดเริ่มต้นจริงๆ นโยบาย Origin Protocol ต้องเป็น "HTTP เท่านั้น" อันเป็นผลมาจากการใช้จุดสิ้นสุดของเว็บไซต์
Cloudfront รองรับโดเมน APEX แต่เฉพาะเมื่อคุณใช้บันทึก ALIAS
ของ Route53 เท่านั้น ข้อมูลเพิ่มเติมสามารถพบได้ในประกาศอย่างเป็นทางการ
ข้อจำกัดนี้ทำให้การตั้งค่าโดเมนรูท (APEX) อัตโนมัติทำได้ยากขึ้น ดังนั้น ขณะนี้ยังไม่รองรับการสร้างไซต์สำหรับโดเมนรูทโดยไม่ต้องจัดการ DNS ด้วย Route53 ด้วย