Các mẫu kiến trúc cho việc tiêu thụ private API giữa các tài khoản

Bài blog này được viết bởi Thomas Moore, Kiến trúc sư Giải pháp Cấp cao và Josh Hart, Kiến trúc sư Giải pháp Cấp cao.

Amazon API Gateway cho phép nhà phát triển tạo ra các REST API riêng tư chỉ có thể truy cập từ một mạng riêng ảo (VPC). Lưu lượng truy cập đến API riêng tư sử dụng các kết nối bảo mật và không rời khỏi mạng AWS, có nghĩa là AWS cô lập nó khỏi Internet công cộng. Điều này khiến cho các endpoints API Gateway riêng tư là một sự lựa chọn tốt cho việc xuất bản các API nội bộ, chẳng hạn như các API được sử dụng cho giao tiếp của các dịch vụ con sau.

Trong các kiến trúc microservice, khi nhiều nhóm xây dựng và quản lý các thành phần khác nhau, các tài khoản AWS khác nhau thường tiêu thụ các endpoints API riêng tư.

Bài đăng trên blog này cho thấy cách một dịch vụ có thể tiêu thụ một endpoints API Gateway riêng tư được xuất bản trong một tài khoản AWS khác một cách an toàn qua AWS PrivateLink.

Sử dụng endpoints API Gateway riêng tư trên nhiều tài khoản thông qua AWS PrivateLink.

Bài viết này tập trung vào việc tiêu thụ các endpoints API Gateway trên nhiều tài khoản. Để phơi bày các tài nguyên giao cắt tài khoản đằng sau một API Gateway, hãy đọc bài đăng blog đã có sẵn này.

Tổng quan

Để truy cập các endpoints riêng tư API Gateway, bạn phải tạo một endpoints VPC giao diện (được đặt tên là execute-api) bên trong VPC của mình. Điều này tạo ra một kết nối AWS PrivateLink giữa VPC của tài khoản AWS của bạn và VPC dịch vụ API Gateway. Kết nối PrivateLink cho phép lưu lượng chảy qua không gian địa chỉ IP riêng tư mà không đi qua internet.

PrivateLink cho phép truy cập các endpoints API Gateway riêng tư trong các tài khoản AWS khác nhau mà không cần VPC peering, kết nối VPN hoặc AWS Transit Gateway. Một endpoints execute-api duy nhất được sử dụng để kết nối với bất kỳ API Gateway nào, bất kể API Gateway đích ở tài khoản AWS nào. Chính sách tài nguyên điều khiển xem endpoints VPC nào có quyền truy cập vào endpoints API Gateway riêng tư. Điều này làm cho kiến trúc đa tài khoản đơn giản hơn, không cần định tuyến phức tạp hoặc kết nối giữa các VPC.

Sơ đồ sau cho thấy endpoints VPC giao diện trong tài khoản người tiêu dùng tạo ra một kết nối PrivateLink trở lại VPC tài khoản dịch vụ API Gateway. Chính sách tài nguyên được áp dụng cho API riêng tư xác định endpoints VPC nào có thể truy cập API. Vì lí do này, việc đảm bảo chính sách tài nguyên chính xác là rất quan trọng để ngăn chặn việc truy cập không cố ý từ các endpoints VPC tài khoản AWS khác.

Truy cập vào các endpoints API Gateway riêng tư yêu cầu một kết nối AWS PrivateLink đến VPC tài khoản dịch vụ AWS.

Trong ví dụ này, chính sách tài nguyên từ chối tất cả các kết nối đến endpoints API riêng tư trừ khi điều kiện aws:SourceVpce khớp với vpce-1a2b3c4d trong tài khoản A. Điều này có nghĩa là kết nối từ các endpoints VPC execute-api khác bị từ chối. Để cho phép truy cập từ tài khoản B, thêm vpce-9z8y7x6w vào chính sách tài nguyên. Tham khảo tài liệu để tìm hiểu về các khóa điều kiện khác mà bạn có thể sử dụng trong các chính sách tài nguyên API Gateway.

Để biết thêm chi tiết về cách liên kết VPC hoạt động, hãy đọc Understanding VPC links in Amazon API Gateway private integrations.

Các phần sau đây bao gồm ba mô hình kiến ​​trúc để tiêu thụ các endpoints API Gateway riêng tư vượt qua các tài khoản:

  1. Regional API Gateway tới private API Gateway
  2. Hàm Lambda gọi API Gateway trong tài khoản khác
  3. Container microservice gọi API Gateway trong tài khoản khác bằng cách sử dụng mTLS

Regional API Gateway sang private API Gateway  qua các tài khoản khác nhau trên AWS

Khi xây dựng các dịch vụ nhỏ trong các AWS account khác nhau, các endpoints API Gateway riêng tư thường được sử dụng để cho phép giao tiếp giữa các dịch vụ. Đôi khi một phần của các endpoints này phải được phơi bày công khai để người dùng cuối tiêu dùng. Một mô hình cho điều này là có một cổng API Gateway công khai trung tâm, hoạt động như cửa trước cho nhiều endpoints API Gateway riêng tư. Điều này cho phép quản lý trung tâm của xác thực, đăng nhập và giám sát.

Sơ đồ dưới đây cho thấy cách đạt được điều này bằng cách sử dụng một liên kết VPC. Liên kết VPC cho phép bạn kết nối tích hợp API Gateway với các tài nguyên riêng tư bên trong một VPC. endpoints giao diện VPC của API Gateway là tài nguyên VPC mà bạn muốn kết nối, vì điều này đang định tuyến lưu lượng đến các endpoints API Gateway riêng tư trong các AWS account khác nhau.

VPC link yêu cầu sử dụng Network Load Balancer (NLB). Target group của NLB trỏ đến địa chỉ IP riêng tư của endpoints VPC, thường là một cho mỗi khu vực khả dụng. Kiểm tra sức khỏe của target group phải xác thực dịch vụ API Gateway đang hoạt động. Bạn có thể sử dụng đường dẫn /ping được đặt trước của API Gateway để làm điều này, trả về mã trạng thái HTTP 200 khi dịch vụ khỏe mạnh.

Bạn có thể triển khai mô hình này trong tài khoản của mình bằng cách sử dụng mã CDK ví dụ được tìm thấy trên GitHub.

Hàm Lambda gọi API Gateway riêng tư vượt qua các tài khoản khác

Yêu cầu phổ biến khác là cho các hàm AWS Lambda gọi đến các endpoints API Gateway riêng tư trong các tài khoản khác. Điều này cho phép giao tiếp dịch vụ-đến-dịch vụ trong kiến trúc microservice.

Sơ đồ sau cho thấy cách đạt được điều này bằng cách sử dụng các interface endpoints cho Lambda, cho phép truy cập vào các tài nguyên riêng tư bên trong mạng riêng ảo của bạn. Điều này cho phép Lambda truy cập vào endpoints VPC của API Gateway và do đó, các endpoints API Gateway riêng tư trong tài khoản khác.

Khác với ví dụ trước, không cần NLB hay VPC link. Chính sách tài nguyên trên private API Gateway phải cho phép truy cập từ VPC endpoint trong tài khoản nơi chứa Lambda function sử dụng.

Vì Lambda function có kết nối VPC attachment, nó sẽ sử dụng DNS resolution từ bên trong VPC. Điều này có nghĩa là nếu bạn chọn tùy chọn Enable Private DNS Name khi tạo interface VPC endpoint cho API Gateway, địa chỉ endpoint https://{restapi-id}.execute-api.{region}.amazonaws.com sẽ tự động phân giải thành địa chỉ IP riêng tư. Lưu ý rằng cấu hình DNS này có thể chặn truy cập từ các endpoint API Regional và edge-optimized từ bên trong VPC. Để biết thêm thông tin, vui lòng tham khảo bài viết trung tâm kiến thức.

Bạn có thể triển khai mẫu này trong tài khoản của mình bằng mã CDK mẫu được tìm thấy trên GitHub.

Gọi tới private API Gateway trên các tài khoản khác nhau bằng mutual TLS (mTLS)

Khách hàng hoạt động trong các ngành được quy định, như ngành ngân hàng mở, thường phải triển khai mutual TLS (mTLS) để truy cập API một cách an toàn. Nó cũng rất tốt cho các ứng dụng IoT để xác thực các thiết bị bằng chứng chỉ số.

API Gateway khu vực (Regional API Gateway) có hỗ trợ native cho mTLS, nhưng hiện tại, API Gateway riêng tư (private API Gateway) không hỗ trợ mTLS, vì vậy bạn phải chấm dứt mTLS trước khi API Gateway. Một mẫu là triển khai dịch vụ proxy trên tài khoản sản phẩm (producer account) giải quyết các bước bắt tay mTLS, chấm dứt mTLS và proxy yêu cầu đến API Gateway riêng tư qua HTTPS thông thường.

Sơ đồ sau cho thấy cách sử dụng kết hợp giữa PrivateLink, proxy dựa trên NGINX và private API Gateway để triển khai mTLS và tiêu thụ private API trên các tài khoản.

Trong biểu đồ kiến trúc này, Amazon ECS Fargate được sử dụng để chứa tác vụ container chạy máy chủ proxy NGINX. Proxy này xác thực chứng chỉ được truyền qua bởi khách hàng kết nối trước khi chuyển kết nối đến API Gateway thông qua endpoints VPC execute-proxy. Cấu hình mẫu NGINX sau đây cho thấy cách dịch vụ proxy mTLS hoạt động bằng cách sử dụng các thiết lập ssl_verify_client và ssl_client_certificate để xác thực chứng chỉ khách hàng kết nối và proxy_pass để chuyển tiếp yêu cầu đến API Gateway.

nginx

server {

    listen 443 ssl;

    ssl_certificate     /etc/ssl/server.crt;

    ssl_certificate_key /etc/ssl/server.key;

    ssl_protocols       TLSv1.2;

    ssl_prefer_server_ciphers on;

    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    ssl_client_certificate /etc/ssl/client.crt;

    ssl_verify_client      on;

    location / {

        proxy_pass https://{api-gateway-endpoint-api};

    }

}

Người dùng kết nối phải cung cấp chứng chỉ khách hàng khi kết nối đến API thông qua dịch vụ endpoints VPC:

Bash

curl –key client.key –cert client.crt –cacert server.crt https://{vpc-endpoint-service-url}

Sử dụng các quy tắc nhóm bảo mật VPC trên cả VPC endpoint và NGINX proxy để ngăn khách hàng vượt qua mTLS endpoint và kết nối trực tiếp với endpoints API Gateway.

Trong kho lưu trữ GitHub, có một tệp cấu hình NGINX và Dockerfile để cấu hình giải pháp này.

Kết luận

Bài đăng này khám phá ba giải pháp để tiêu thụ Private API Gateway trên các tài khoản AWS. Một thành phần chính của tất cả các giải pháp là endpoints giao diện VPC. Bằng cách sử dụng VPC Endpoints & PrivateLink, bạn có thể tiêu thụ các tài nguyên một cách an toàn và thậm chí cả các microservices của riêng mình trên các tài khoản AWS. Để biết thêm thông tin, đọc bài viết Enabling New SaaS Strategies with AWS PrivateLink. Ghé thăm kho lưu trữ GitHub để bắt đầu thực hiện một trong những giải pháp này ngay hôm nay.

Để biết thêm tài nguyên học tập về serverless, hãy truy cập Serverless Land.

Leave a comment