Triển khai Centralized VPC Interface Endpoints trong môi trường AWS Multi-Account

Bối cảnh

Khi bạn bắt đầu làm việc trong một AWS Multi-Account Organization, sẽ có hai yếu tố quan trọng nhất mà bạn thường xuyên phải cân nhắc:

  • Security
  • Cost Optimization

Để đảm bảo kết nối an toàn giữa VPC và các AWS Services, bạn có thể sử dụng VPC Interface Endpoints. Chúng cho phép tài nguyên trong VPC kết nối trực tiếp đến các dịch vụ AWS mà không cần phải thông qua Internet Gateway, NAT device, VPN hoặc AWS Direct Connect.

Các instances trong VPC sẽ không cần dùng public IP addresses để giao tiếp với AWS Services, thay vào đó, chúng sử dụng VPC Endpoint.

Tuy nhiên, khi bắt đầu nghĩ đến việc triển khai VPC Interface Endpoints, câu hỏi đầu tiên xuất hiện trong đầu bạn sẽ là:

Giá của VPC Interface Endpoints

Khi dùng VPC Interface Endpoints, bạn phải trả phí trên mỗi endpoint và cho lượng dữ liệu xử lý qua endpoint. Nếu bạn triển khai nhiều endpoint giống nhau ở từng Account và từng VPC, chi phí có thể tăng rất cao.

Bài toán đặt ra

Có cách nào chia sẻ VPC Interface Endpoints giữa nhiều tài khoản trong tổ chức mà không cần nhân bản ở từng VPC/Account?
Câu trả lời: .

Kiến trúc Centralized với Transit Gateway

Kiến trúc Decentralized

  • Bạn có một Shared Services / Network Account (tài khoản dùng chung)
  • Nhiều Application Accounts nơi đặt các workload
  • Nhiều VPC trong các tài khoản này
  • Ban đầu mỗi VPC đều có Interface Endpoint riêng (trong mỗi Account)
  • Kết nối giữa các VPC/tài khoản được thực hiện qua Transit Gateway

Mục tiêu

  • Tập trung tất cả VPC Interface Endpoints vào Shared Services / Network Account.
  • Chia sẻ endpoint với các Application Accounts thông qua Transit Gateway + Route 53 + RAM.
  • Xóa bỏ các endpoint trùng lặp trong Application Accounts để tiết kiệm chi phí.

Kiến trúc Centralized với Transit Gateway

Các thành phần AWS sử dụng

  • Transit Gateway (bắt buộc để đảm bảo routing cross-VPC/cross-account).
  • Route 53 Private Hosted Zone
  • Route 53 Resolver (Inbound & Outbound)
  • AWS Resource Access Manager (RAM)

Các bước triển khai

Tạo VPC Interface Endpoint trong Shared Services Account

  • Ví dụ: tạo endpoint cho dịch vụ EC2.
  • Tắt Private DNS Name mặc định của endpoint.
  • Tạo Private Hosted Zone với tên DNS tương ứng (ví dụ ec2.eu-west-3.amazonaws.com) trong Route 53 và gắn vào VPC chứa endpoint.
Cấu hình Route 53 Resolver
  • Inbound Resolver: nhận truy vấn DNS từ workloads ở các Application Accounts (qua Transit Gateway).
  • Outbound Resolver: forward truy vấn từ các VPC khác về Inbound Resolver.
  • Resolver Rule: tạo rule cho domain của dịch vụ AWS (ví dụ ec2.eu-west-3.amazonaws.com) và trỏ về IP của Inbound Resolver.

Chia sẻ cấu hình DNS với các Application Accounts

  • Dùng Resource Access Manager (RAM) để chia sẻ Resolver Rules với các tài khoản trong Organization.
  • Ở Application Accounts: gắn Resolver Rule đã được chia sẻ vào VPC, xóa endpoint trùng lặp nếu có.
  • Toàn bộ traffic đến AWS Services sẽ được route qua Transit Gateway về Shared Services Account, sau đó sử dụng Interface Endpoint chung.

Lưu ý quan trọng

  • Transit Gateway là bắt buộc trong kiến trúc này để bảo đảm routing giữa các VPC ở nhiều tài khoản. Nếu không có Transit Gateway, traffic từ Application Accounts sẽ không thể đi qua Shared Services Account để sử dụng Endpoint chung.
  • Các thành phần như VPC Interface Endpoints, Route 53 Hosted Zones, Resolver Rules đều là dịch vụ theo region (regional services). Nếu bạn triển khai đa vùng (multi-region), bạn cần lặp lại toàn bộ cấu hình ở từng region.

Code CDK Demo

import * as cdk from 'aws-cdk-lib';
import { Vpc, InterfaceVpcEndpointAwsService, SubnetType } from 'aws-cdk-lib/aws-ec2';
import { CfnTransitGateway, CfnTransitGatewayAttachment } from 'aws-cdk-lib/aws-ec2';
import * as route53 from 'aws-cdk-lib/aws-route53';
import * as ram from 'aws-cdk-lib/aws-ram';

export class SharedServicesStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // 1. Shared Services VPC
    const sharedVpc = new Vpc(this, 'SharedVpc', {
      maxAzs: 2,
      subnetConfiguration: [
        {
          name: 'Private',
          subnetType: SubnetType.PRIVATE_WITH_EGRESS,
        },
      ],
    });

    // 2. Transit Gateway
    const tgw = new CfnTransitGateway(this, 'TransitGateway', {
      amazonSideAsn: 64512,
    });

    new CfnTransitGatewayAttachment(this, 'TgwAttachment', {
      subnetIds: sharedVpc.privateSubnets.map(sn => sn.subnetId),
      transitGatewayId: tgw.ref,
      vpcId: sharedVpc.vpcId,
    });

    // 3. VPC Interface Endpoint (ví dụ EC2 service)
    const ec2Endpoint = sharedVpc.addInterfaceEndpoint('Ec2Endpoint', {
      service: InterfaceVpcEndpointAwsService.EC2,
    });

    // 4. Route53 Private Hosted Zone
    const privateZone = new route53.PrivateHostedZone(this, 'Ec2PHZ', {
      zoneName: 'ec2.eu-west-3.amazonaws.com',
      vpc: sharedVpc,
    });

    new route53.ARecord(this, 'Ec2EndpointAlias', {
      zone: privateZone,
      recordName: 'ec2.eu-west-3.amazonaws.com',
      target: route53.RecordTarget.fromValues(ec2Endpoint.vpcEndpointDnsEntries[0].dnsName),
    });

    // 5. RAM Share cho Resolver Rule (giả định đã có resolver rule sẵn)
    const resourceShare = new ram.CfnResourceShare(this, 'ShareResolverRule', {
      name: 'SharedResolverRules',
      allowExternalPrincipals: false,
      principals: ['arn:aws:organizations::123456789012:organization/o-exampleorgid'], // thay bằng Org ARN
      resourceArns: [
        'arn:aws:route53resolver:eu-west-3:123456789012:resolver-rule/rslvr-rr-example', // ARN của resolver rule
      ],
    });

    new cdk.CfnOutput(this, 'VpcId', { value: sharedVpc.vpcId });
    new cdk.CfnOutput(this, 'TransitGatewayId', { value: tgw.ref });
    new cdk.CfnOutput(this, 'Ec2EndpointId', { value: ec2Endpoint.vpcEndpointId });
  }
}

Kết quả đạt được

  • Tiết kiệm chi phí: loại bỏ việc nhân bản endpoint trong từng account.
  • Tăng cường quản lý tập trung: endpoint và DNS được quản lý từ Shared Services Account.
  • Bảo mật tốt hơn: mọi kết nối đều đi qua hạ tầng mạng tập trung (Transit Gateway).
  • Dễ mở rộng: áp dụng nhất quán cho nhiều account và nhiều VPC trong tổ chức.

Kết Luận

  • Việc triển khai Centralized VPC Interface Endpoints trong môi trường AWS Multi-Account mang lại nhiều lợi ích rõ rệt: giảm chi phí, tăng cường bảo mật, quản lý tập trung và đơn giản hóa kiến trúc mạng. Tuy nhiên, để mô hình này hoạt động hiệu quả, Transit Gateway là thành phần bắt buộc nhằm đảm bảo kết nối giữa các VPC và các tài khoản trong tổ chức.
  • Bằng cách kết hợp Transit Gateway, Route 53 ResolverAWS RAM, bạn có thể xây dựng một kiến trúc mạng tập trung, linh hoạt và dễ mở rộng, đáp ứng tốt cả nhu cầu vận hành lẫn tối ưu chi phí trong môi trường multi-account.

Tài Liệu Tham Khảo