AWS PrivateLink で AZ の異なる EC2 インスタンス同士を疎通させる構成について

記事タイトルとURLをコピーする

マネージドサービス部 佐竹です。
Network Load Balancer (NLB) を作成し、それをエンドポイントサービスとして他アカウントに共有することができる AWS PrivateLink ですが、Availability Zone (AZ) を跨ぎクロスゾーンとする構成に関して少し気になることがあったため調査結果を記載します。

はじめに

以下の公式ドキュメントに詳しく記載のある「AWS PrivateLink」ですが、VPC Peering や Transit Gateway を利用しての接続と異なり、一部のサービスだけを他アカウントに共有するのに重宝するサービスとなっています。

docs.aws.amazon.com

今回のブログではこの AWS PrivateLink をクロスゾーン状態で実装する場合の構成を考えます。細かい設定や設計は割愛しますため、中級~上級者向けのブログとなっています。

AWS PrivateLink の基本的な構成を AWS 公式ドキュメントに掲載されている構成図を参考に、もう少々コンポーネントを付け加えて図示したのが以下です。

AWS PrivateLink の基本構成

AWS PrivateLink は、NLB の Endpoint を他のアカウントの VPC Subnet 内に ENI として「生やせる」サービスです。制限として、同リージョン内での共有が必要です。*1

このため、サービスを共有したい側のアカウント「Side-B(右側)」において NLB を実装し、「Side-A(左側)」のアカウントでその NLB を登録した VPC Endpoint を作成します。*2

また冗長性を担保することを目的に、PrivateLink を実装する場合は少なくとも2つの Availability Zone を利用するようドキュメントに記載がされており、先の構成図もそれに従ったものとなっています。

さて、本ブログの本題です。

EC2 同士が別 AZ に所属している状態での PrivateLink

先の構成図では、AZ-1a のインスタンスは AZ-1a の NLB へ通信しており、AZ-1c は AZ-1c の NLB へ通信していました。

ただし、もし費用の都合でそれぞれ異なる AZ にのみ実装されたインスタンス同士を、さらにクロスゾーンしつつ PrivateLink 経由で通信を可能としたい場合どのような実装が可能でしょうか?

今回は2パターン紹介します。

1. Side-A アカウントでクロスゾーンを実装する

先に記載すると、もう1つの構成と比較してこの実装がベターだと感じます。

まず「Side-A(左側)」の VPC Endpoint がどの AZ に作成できるかは、「Side-B(右側)」アカウントの NLB がどの AZ に実装されているかで決まります。

この構成図の場合、「Side-A(左側)」の VPC Endpoint を AZ-1c で実装することは不可能なため、自動的に AZ-1a に実装することになります。

そして左下に構築された「EC2 ②」インスタンスから AZ を跨いで AZ-1a の VPC Endpoint となる ENI にリーチするように経路を記載すれば問題なく疎通が可能です。この構成では、クロスゾーンは「Side-A」側で行うことになります。

2. Side-B アカウントでクロスゾーンを実装する

比較して、「Side-B(右側)」アカウントでクロスゾーンが可能か検討します。

まず最初に、上図の構成は実装不可能です。

理由ですが、ELB は Mapping された Subnet が所属する AZ において、同 AZ に存在するターゲットグループのリソースにヘルスチェックを行います。この構成の場合、NLB は AZ-1c のEC2 インスタンスにはヘルスチェックを行えますが、右上にある「EC2 ③」にヘルスチェックを行うことはできません。

結果として「unused」ステータスとなってしまいます。

これを回避するためには、上図の通りヘルスチェックが正しく行われるように「NLB を AZ-1a にもマッピングさせる」という対応が必要です。

これにより「healthy」ステータスとなれば、AZ-1c から AZ-1a の EC2 インスタンスへの疎通が可能になります。

Cross-zone load balancing の設定

この時、NLB の Cross-zone load balancing の設定が「On」である必要があります。本設定はデフォルトで「Off」のため注意してください。

加えて、Endpoint Service を作成後に NLB で Mapping した Subnet(AZ)を増やした場合は、Endpoint Service 側で「Associate or Disassociate load balancers」の画面を一度開いて「Save changes」を押下する必要があります。この作業を行わない限り、Endpoint Service に利用可能な AZ が増えた情報が伝わらない点に注意してください。

そしてこの2つ目の構成は、正直なところ綺麗ではないと感じます。「Side-A(左側)」の VPC が全て 1c のみで CIDR を使い切るように Subnet 構成されている場合等を除き、本構成を選択する意味はないのではないかと感じました。

まとめ

AWS PrivateLink の基本構成

本ブログでは AWS PrivateLink をクロスゾーンで構成する必要が出た場合に取り得ることが可能な実装方法2種類を紹介しました。

1つは接続元の AWS アカウントでクロスゾーンする実装であり、もう1つは接続先である NLB を構築するアカウントでクロスゾーンする実装でした。

お勧めのクロスゾーン PrivateLink 構成

基本的には1つ目に紹介しました、接続元の AWS アカウント「Side-A(左側)」でクロスゾーンする方がシンプルな構成で良いと感じます。

本ブログが AWS PrivateLink のクロスゾーン実装で何らかの参考になれば幸いです。

では、またお会いしましょう。

*1:Inter-Region VPC Peering を合わせて利用する場合、リージョン間も跨ぐことが可能です https://aws.amazon.com/jp/about-aws/whats-new/2018/10/aws-privatelink-now-supports-access-over-inter-region-vpc-peering/

*2:両方向の通信が必要な場合、NLB を両方のアカウントに作成する必要があります

佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ

マネージドサービス部所属。AWS資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023 Japan AWS Top Engineers/2020-2023 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。