ฉันจะใช้ AWS CloudFront และ API Gateway แบบคู่ขนานสำหรับโดเมนเดียวกันได้อย่างไร


9

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

ฉันยังมีคำขอ POST บางอย่างที่ฉันต้องจัดการ ส่งแบบฟอร์มส่งอีเมลแจ้งเตือนโต้ตอบกับฐานข้อมูล

ฉันจะตั้งค่า Lambda (หรือ API เกตเวย์) เคียงข้างกันด้วย CloudFront สำหรับโดเมนเดียวกันได้อย่างไรเพื่อที่ CloudFront จะจัดการคำขอ GET และ API เกตเวย์จะจัดการกับคำขอด้วยคำขอเนื้อความหรือ POST หรือฉันสามารถทำได้ด้วย URL แยกต่างหาก

คำตอบ:


2

ฉันใช้งานแอพพลิเคชั่นเว็บหลาย ๆ ตัวตามการออกแบบที่เสนอของคุณและฉันได้แยกgofaas , แอพ Go and Lambda เพื่อการศึกษาเพื่อแบ่งปันเทคนิค

คุณต้องมีสองโดเมนแยกกันเช่นwww.gofaas.netS3 + CloudFront และapi.gofaas.netAPI Gateway + Lambda

จากนั้นคุณสามารถให้ไซต์สแตติกของคุณโต้ตอบกับ API ด้วยการกำหนดค่า API เกตเวย์ CORS และ JavaScript บางส่วน

fetch(`https://api.gofaas.net/work`, {
    method: "POST",
    mode: "cors",
    headers: {
        "Accept": "application/json",
        ...
    },
    body: JSON.stringify(...)
})
    .then(function(response) {
        return response.json();
    })
    .then(function (json) {
        // use response
    })
    .catch(function (err) {
        console.log("fetch error", err);
    });

นี่คือคำแนะนำสำหรับการตั้งค่าทั้งหมดนี้:

เว็บไซต์คงที่ด้วย S3, CloudFront และ ACM

การรักษาความปลอดภัย API ด้วย Lambda, API Gateway, CORS และ JWT


การทดสอบเว็บไซต์จะน่าสนใจเสมอที่นี่ เป็นการยากที่จะทำซ้ำโครงสร้างพื้นฐาน AWS ในพื้นที่เพื่อให้คุณสามารถทำการทดสอบการรวมภายในเครื่อง ฉันใช้เส้นทางแทนโดเมนย่อย ที่ช่วยเป็นส่วนหนึ่งของการทดสอบ ยังกำจัดความท้าทาย CORS จากนั้นเกตเวย์ API จะกลายเป็นจุดเริ่มต้นสำหรับ CloudFront สำหรับเส้นทางนั้น
Costa

6

คุณสามารถสร้างฟังก์ชั่นแลมบ์ดาตั้งค่าเกตเวย์ API จากนั้นกำหนดค่า CloudFront เพื่อส่งต่อพา ธ บางอย่าง (เช่น / rest / *) ไปยังเกตเวย์ API และให้บริการทุกอย่างจาก S3 bucket

นี่คือขั้นตอนที่สมบูรณ์ในการแสดงวิธีการทำสิ่งนี้: https://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/


2

จากจุดเชื่อมต่อของมุมมอง "บางอย่าง" จำเป็นต้องตอบคำขอของคุณ (GET, POST, PUT, ทุกอย่าง) ก่อนอื่นคุณต้องมีการเชื่อมต่อ TCP และ "บางสิ่ง" จำเป็นต้องตรวจสอบให้แน่ใจว่าเป็นการเข้าใจเลเยอร์ 7 และทำให้รู้สึกว่าไบต์ที่ไคลเอ็นต์กำลังส่ง เมื่อมาถึงจุดนี้มันเป็นไปได้ที่จะจัดการกับคำขอ GET แตกต่างจากคำขอ POST หรือหนึ่ง URL มากกว่า URL อื่น ดังนั้นในที่สุดคุณต้องมีบริการที่สามารถเข้าใจและกำหนดเส้นทาง HTTP ได้ บริการต่อไปนี้สามารถทำสิ่งนี้ได้: เกตเวย์ CloudFront ELB / ALB API (ข้อ จำกัด มาภายหลัง)

API Gateway ใช้ CloudFront ภายใน (โดยไม่ให้โอกาสคุณปรับแต่งอะไรในระดับ CloudFront) - นั่นหมายความว่าไม่มีทางที่จะเรียกใช้ CloudFront และ API Gateway เคียงข้างกันในท้ายที่สุดสิ่งนี้หมายความว่าคุณรัน CloudFront ด้วย CloudFront เคียงบ่าเคียงไหล่.

CloudFront เปิดโอกาสให้คุณเลือกต้นกำเนิดที่แตกต่างกันตามรูปแบบ - แต่คุณสามารถเลือก S3 หรือ ELB / ALB เป็นจุดเริ่มต้นไม่ใช่ฟังก์ชั่นของแลมบ์ดา (นอกเหนือจากฟังก์ชั่นแลมบ์ดาเอดจ์)

ALB / ELB สามารถใช้อินสแตนซ์ EC2 เป็นแบ็กเอนด์เท่านั้น - ไม่มีแลมบ์ดาหรือ S3 ที่นี่

วิธีเดียวที่ฉันสามารถนึกได้ว่าสิ่งใดที่คุณอาจต้องการทำคือ:

  • คุณใช้ API เกตเวย์และกำหนดเส้นทาง "สินทรัพย์" เฉพาะ - ไปยังฟังก์ชั่นแลมบ์ดาซึ่งทำหน้าที่เป็นพร็อกซีย้อนกลับสำหรับ S3 (ดังนั้นการวางสินทรัพย์ถาวรผ่านแลมบ์ดา) - ระวังค่าใช้จ่ายสำหรับแลมบ์ดาที่นี่!
  • คุณสามารถทำสิ่งเดียวกันได้ แต่แทนที่จะส่งผ่านสินทรัพย์ผ่านแลมบ์ดาเพียงแค่สร้าง URL ที่ได้รับการรับรองภายในแลมบ์ดาการเปลี่ยนเส้นทางไปยัง S3 เพื่อให้บริการโดยตรง (อาจมีประสิทธิภาพมากกว่า)
  • การใช้โดเมนย่อยที่แตกต่างกันสำหรับสินทรัพย์ของคุณนอกเหนือจากส่วนที่เหลือของแอปพลิเคชันของคุณ - นี่เป็นรูปแบบทั่วไปมากเนื่องจากคุณสามารถแยกระดับ DNS และใช้บริการต่าง ๆ สำหรับกรณีการใช้งานที่แตกต่างกัน (CloudFront สำหรับสินทรัพย์และ API เกตเวย์สำหรับแบบไม่คงที่ ชิ้นส่วน)

ดังนั้นการโทรของฉันจะเป็นตัวเลือกสุดท้าย - แต่นั่นหมายความว่าคุณต้องชี้ไคลเอนต์ / เบราว์เซอร์ไปยังโดเมนย่อยแยกต่างหากสำหรับสินทรัพย์คงที่ทั้งหมด (หรือสำหรับคำขอ POST ทั้งหมด)

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


2

ฉันมีการตั้งค่าเดียวกัน สินทรัพย์คงที่ใน S3 ฟังก์ชั่นแลมบ์ดาทำหน้าที่ผ่านเกตเวย์ API และใช้ชื่อโดเมนเดียวกัน

ฉันไปกับเกตเวย์ API ซึ่งใช้ CloudFront อยู่แล้วและแสดงฟังก์ชั่นการใช้งานบางอย่างเช่นการแคช จากนั้นฉันกำหนดค่า URIs ที่จับคู่กับสินทรัพย์คงที่ ใน API Gateway ทรัพยากรสามารถเป็นฟังก์ชัน Lambda, ฟังก์ชัน AWS, จำลองหรือ URL อื่น ฉันให้พวกเขาชี้ไปที่ URL S3 ของฉัน

สามารถตั้งค่า URI ให้เป็นทางเข้าย่อยได้เช่น/assets/*กัน


ดังนั้นส่วนที่ทำให้ฉันมีปัญหาคือการปรับใช้ API /assets/*มันมักจะใช้งานได้โดยไม่ต้องเส้นทางชั้นนำในกรณีของคุณ ฉันต้องลบการใช้งานและคลิกขวาบน/assets/*เส้นทางและปรับใช้จากที่นั่น
Costa

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