Một số nền tảng:
Tôi đã tạo một mạng phức tạp vừa phải bằng vpc của Amazon. Đó là một mạng ba tầng trên hai vùng khả dụng. Mỗi lớp có một mạng con trong vùng-a và vùng-b. Lớp trình bày ở trên cùng, có một lớp ứng dụng ở giữa và một lớp lõi ở phía dưới.
Tất cả các nhóm bảo mật và ACL cho các mạng con hiện đang cho phép TẤT CẢ lưu lượng truy cập trong và ngoài nước để giúp tôi giảm diện tích bề mặt của vấn đề.
Bảng định tuyến của lớp trình bày đang trỏ tất cả lưu lượng truy cập đến một cổng internet. Cổng NAT nằm trong một mạng con tách biệt cũng hướng tất cả lưu lượng truy cập đến cổng internet.
Ứng dụng của tôi có hai thành phần, UI (React.js) và API (Node / Express). Chúng được triển khai như hình ảnh docker. Trước mặt là một bộ cân bằng tải cổ điển.
UI-ELB phải đối mặt với internet và nằm trong lớp trình bày, định tuyến lưu lượng truy cập từ 80/443 đến cổng 8080 và được liên kết với ứng dụng-ec2 của tôi được đặt trong mạng con lớp ứng dụng.
API của tôi có bộ cân bằng tải bên trong phía trước. API-ELB nằm trong lớp ứng dụng (trong cùng mạng con với app-ec2) và nhận lưu lượng truy cập trên cổng 80/443 và chuyển nó xuống api-ec2 trong lõi trên cổng 3000.
Cả hai bộ cân bằng tải đang giảm tải chứng chỉ trước khi truyền lưu lượng đến phiên bản của chúng.
Tôi có cả bộ cân bằng tải của mình được liên kết dưới dạng bí danh trong Route53 và được tham chiếu trong các ứng dụng bằng url đẹp của chúng ( https://app.website.com ). Mỗi bộ cân bằng tải vượt qua các kiểm tra sức khỏe đã xác định và báo cáo tất cả các trường hợp ec2 đang sử dụng.
Cuối cùng, trên API tôi đã kích hoạt cors bằng gói cors nodejs.
Đây là một sơ đồ nhanh và bẩn của mạng của tôi.
Vấn đề:
APP-ELB thành công đưa tôi đến ứng dụng. Tuy nhiên, khi ứng dụng cố gắng gửi yêu cầu GET đến API-ELB, trước tiên, ứng dụng sẽ gửi yêu cầu TÙY CHỌN hết thời gian với mã lỗi 408.
Nơi mà nó trở nên kỳ lạ
Một số điều kỳ lạ nhất tôi gặp phải khi gỡ lỗi là:
- Tôi có thể SSH vào phiên bản app-ec2 và có thể chạy thử thành công với API-ELB. Tôi đã thử rất nhiều, và tất cả đều hoạt động. Một vài ví dụ là:
curl -L https://api.website.com/system/healthcheck
vàcurl -L -X OPTIONS https://api.website.com/system/healthcheck
. Nó luôn trả về thông tin mong muốn. - Tôi đã chuyển toàn bộ ứng dụng ra khỏi mạng của mình thành một vpc mặc định công khai và nó hoạt động như mong muốn.
- Tôi có api-ec2 viết tất cả các yêu cầu mạng đến bàn điều khiển. Mặc dù nó hiển thị các yêu cầu kiểm tra sức khỏe, nhưng nó không hiển thị bất kỳ yêu cầu nào từ ứng dụng-ec2. Điều này khiến tôi tin rằng lưu lượng truy cập thậm chí không đạt đến api.
Thực sự điều lớn nhất khiến tôi mất hoàn toàn là việc cuộn tròn api elb nội bộ hoạt động, nhưng yêu cầu axios cho cùng một url chính xác thì không. Điều này không có ý nghĩa với tôi cả.
Những gì tôi đã thử
Ban đầu tôi đã dành rất nhiều thời gian để chơi với các quy tắc ACL và các nhóm bảo mật nghĩ rằng tôi đã làm gì đó sai. Cuối cùng, tôi chỉ nói, "vặn nó", và mở mọi thứ lên để thử và đưa phần đó ra khỏi phương trình.
Tôi đã dành nhiều thời gian để chơi với Cors trên api của tôi. Cuối cùng hạ cánh trên cấu hình tôi có bây giờ, đó là cuộc app.use(cors())
gọi lại mặc định được cung cấp bởi gói nút cors. Tôi cũng đã bao gồm những app.options('*', cors())
gì được khuyến nghị trong tài liệu.
Tôi đã google mọi thứ dưới ánh mặt trời, nhưng cụ thể là tôi có cần xác định một số tiêu đề tùy chỉnh đặc biệt với khuỷu tay không? Nhưng dường như không thể tìm thấy bất cứ điều gì. Thêm vào đó, khi tôi chuyển ứng dụng của mình ra khỏi mạng, nó hoạt động rất tốt.
Tôi chắc chắn rằng tôi đã thử nhiều thứ khác, nhưng những thứ này dường như là thích hợp nhất. Tôi đang thiếu gì? Tôi nhận ra đây có thể là một vấn đề rất mơ hồ và rộng lớn, và một bài viết rất lớn, nhưng tôi đánh giá cao bất kỳ cái nhìn sâu sắc và thời gian của bạn trong việc đọc nó!
curl -X OPTIONS 127.0.0.1...
trên ứng dụng-ec2? Chỉ OPTIONS
là bị hỏng? ELB là "Cổ điển" không phải là "Ứng dụng", đúng không? Có phải tất cả các trường hợp có thể truy cập Internet chính xác thông qua NAT, vd curl ipv4.icanhazip.com
? (Vâng, tôi yêu cầu một lý do có vẻ mơ hồ.)