Làm cách nào tôi có thể sử dụng AWS CloudFront và API Gateway cạnh nhau cho cùng một tên miền?


9

Tôi đang đặt tài sản tĩnh của trang web của mình trên S3 và thiết lập CloudFront để phân phối chúng. Những thứ này về cơ bản giữ nội dung mà người dùng sẽ cần cho bất kỳ yêu cầu GET nào trên trang web của tôi, đối với các đường dẫn hiện có, với một lỗi bắt lỗi.

Tôi cũng có một số yêu cầu POST tôi cần xử lý. Gửi biểu mẫu, gửi email, thông báo, tương tác với cơ sở dữ liệu.

Làm cách nào tôi có thể thiết lập Lambda (hoặc API Gateway) song song với CloudFront cho cùng một tên miền để CloudFront xử lý các yêu cầu GET và API Gateway xử lý các yêu cầu với thân hoặc yêu cầu POST. Hoặc tôi có thể làm điều đó bằng URL cá nhân bằng cách nào đó?

Câu trả lời:


2

Tôi chạy nhiều ứng dụng web chính xác với thiết kế được đề xuất của bạn và tôi đã trích xuất gofaas , một ứng dụng Go và Lambda giáo dục, để chia sẻ các kỹ thuật.

Bạn cần hai tên miền riêng biệt, ví dụ: www.gofaas.netS3 + CloudFront và api.gofaas.netAPI Gateway + Lambda.

Sau đó, bạn có thể để trang web tĩnh của mình tương tác với API với cấu hình API Gateway CORS và một số 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);
    });

Dưới đây là một số hướng dẫn để thiết lập tất cả điều này:

Trang web tĩnh với S3, CloudFront và ACM

Bảo mật API với Lambda, API Gateway, CORS và JWT


Kiểm tra trang web luôn trở nên thú vị ở đây. Thật khó để nhân rộng cơ sở hạ tầng AWS cục bộ để bạn có thể thực hiện các bài kiểm tra tích hợp cục bộ. Tôi sử dụng một tuyến đường thay vì một tên miền phụ. Điều đó giúp một phần của thử nghiệm. Cũng loại bỏ những thách thức CORS. Sau đó, API Gateway trở thành nguồn gốc cho CloudFront cho tuyến đường đó.
Costa


2

Từ quan điểm kết nối, "một cái gì đó" cần phải trả lời các yêu cầu của bạn (GET, POST, PUT, mọi thứ). Trước hết, bạn có kết nối TCP và "một cái gì đó" cần đảm bảo rằng nó hiểu được lớp 7 và hiểu được các byte mà máy khách đang gửi. Chỉ tại thời điểm này, có thể xử lý các yêu cầu GET khác với yêu cầu POST hoặc một URL so với URL khác. Vì vậy, cuối cùng bạn cần một dịch vụ có khả năng hiểu và định tuyến HTTP. Các dịch vụ sau có khả năng thực hiện việc này: Cổng API ELB / ALB của CloudFront (giới hạn đến sau)

API Gateway sử dụng CloudFront trong nội bộ (không cho bạn cơ hội thực sự định cấu hình mọi thứ ở cấp độ CloudFront) - điều đó có nghĩa là không có cách nào để chạy song song CloudFront và API Gateway vì điều này có nghĩa là bạn sẽ chạy CloudFront với CloudFront cạnh bên nhau.

CloudFront cung cấp cho bạn cơ hội chọn các nguồn gốc khác nhau dựa trên các mẫu - nhưng bạn chỉ có thể chọn S3 hoặc ELB / ALB làm nguồn gốc - không phải chức năng Lambda (ngoài chức năng Lambda @ Edge).

ALB / ELB chỉ có thể sử dụng các phiên bản EC2 làm phụ trợ - không có Lambda hoặc S3 ở đây.

Những cách duy nhất tôi có thể nghĩ ra có thể làm những gì bạn muốn làm là:

  • Bạn sử dụng API Gateway và định tuyến một "tài sản" cụ thể đến chức năng Lambda có loại proxy ngược cho S3 (vì vậy, chuyển các tài sản tĩnh qua lambda) - hãy lưu ý về chi phí cho Lambda tại đây!
  • Bạn có thể làm tương tự nhưng thay vì dẫn tài sản qua Lambda, chỉ cần tạo một URL đã ký trong Lambda, chuyển hướng trực tiếp đến S3 để phục vụ (có thể hiệu quả hơn về chi phí)
  • Sử dụng các tên miền phụ khác nhau cho tài sản của bạn so với phần còn lại của ứng dụng - đây là mô hình rất phổ biến vì bạn có thể dễ dàng tách ra ở cấp DNS và sử dụng các dịch vụ khác nhau cho các trường hợp sử dụng khác nhau (CloudFront cho tài sản và Cổng API cho không tĩnh các bộ phận)

Vì vậy, cuộc gọi của tôi sẽ là tùy chọn cuối cùng - nhưng điều đó có nghĩa là bạn cần trỏ máy khách / trình duyệt đến một tên miền phụ riêng cho tất cả các tài sản tĩnh (hoặc cho tất cả các yêu cầu POST).

Có vẻ như bạn muốn có một cái nhìn về các công nghệ như AngularJS hoặc React để xây dựng một ứng dụng thực sự dựa trên API trong trình duyệt. Với cách tiếp cận này, bạn đang chạy một API thực sự đang xử lý tất cả các yêu cầu "động" với Cổng API và phân phối ứng dụng từ S3 như một tài sản tĩnh. Có lẽ nhìn vào những thứ đó có thể giúp bạn tìm đường - ngay cả khi bạn không sử dụng chúng, mô hình kiến ​​trúc về cách xây dựng những thứ như thế này là những gì bạn đang yêu cầu imho.


2

Tôi có cùng một thiết lập. Các tài sản tĩnh trên S3, các hàm Lambda được phân phối thông qua cổng API và chúng có chung tên miền.

Tôi đi với cổng API đã sử dụng CloudFront và hiển thị một số chức năng của nó như bộ đệm. Sau đó, tôi định cấu hình các URI ánh xạ tới các tài sản tĩnh. Trong API Gateway, tài nguyên có thể là hàm Lambda, hàm AWS, giả hoặc URL khác. Tôi có chúng trỏ đến URL S3 của tôi.

Các URI cũng có thể được đặt thành các đường dẫn phụ lên toàn cầu, vd /assets/*.


Vì vậy, phần gây rắc rối cho tôi là triển khai API. Nó thường triển khai mà không có đường dẫn, trong trường hợp của bạn /assets/*. Tôi phải xóa việc triển khai, và nhấp chuột phải vào /assets/*đường dẫn và triển khai từ đó.
Costa

1
Tôi nên đào sâu vào các công cụ dòng lệnh và tìm hiểu cách tạo và chỉnh sửa api và lambda từ đó.
Costa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.