[小ネタ] 1つの NLB を API Gateway VPC integration と PrivateLink で共有する

2019.10.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

小ネタです。NLB(Network Load Balancer)を使って外部にサービスを公開する機能として、API Gatewayを使うVPC統合(VPC Link)とVPC間で共有するPrivateLinkがあります。この2つの機能で、1つのNLBを共有できないか試しました。

API GatewayのVPC統合(VPC Link)とPrivateLinkについてはそれぞれ以下の記事で紹介しています。

【新機能】API Gateway VPC integrationを使ってみた #reinvent

【新機能】PrivateLinkで独自エンドポイントを作ってアプリをプライベート公開する #reinvent

やりたかったこと

今回やりたかったことは、以下のように1つのNLB配下で動作するサービス(API)を、API Gatewayによるインターネットへの公開と、PrivateLinkによる他のVPCへの公開です。

API GatewayのVPC統合自体がPrivateLinkの機能を応用しているサービスなので、共用できないかと考えて試してみました。

それでは実際に環境を設定します。結論を先に言うと、

  • NLBをエンドポイントサービスで公開してからAPI GatewayのVPC Linkを作成 -> 設定不可
  • API GatewayのVPC Linkを作成してからエンドポイントサービスの公開先を追加 -> 設定可能

という結果でした。実際の挙動は以下の通りです。

先にNLBをエンドポイントサービスに公開した場合

まずは内部NLBを作成しておきます。

作成したNLBを、エンドポイントサービスで公開。

これでPrivateLinkとしてNLBを経由したサービスが公開されました。

この状態で、同じNLB指定してAPI GatewayのVPC Linkを作成します。

すると、作成の実行自体はできましたが、すぐに「失敗」ステータスとなりました。NLBがすでに他のエンドポイントサービスに関連付けられている旨のメッセージが確認できます。

コンソールだけではなく、CLIやCloudFormationでも同じエラーの結果でした。すでにエンドポイントサービスに公開されているNLBを使ってAPI GatewayのVPC Linkの作成はできないようです。

先にAPI GatewayのVPC Linkを作成した場合

では、先ほどは逆に、先にAPI GatewayのVPC Linkを作成するパターンで試してみます。

まずは、VPC Linkを作成。これは特に問題ありません。

続いて、エンドポイントサービスの設定です。VPC Linkを作成した時点で、対象NLBを使ったエンドポイントサービスは作成されています。

エンドポイント接続を確認すると、特定のAWSアカウントで利用されている状態を示しています。つまり、VPC Link自体がある特殊なAWSアカウントに対するエンドポイントサービスと言えます。

ここに、公開したい先のAWSアカウントをホワイトリストに追加します。特に問題なく追加が可能でした。

公開先のAWSアカウントでエンドポイントを作成してみます。

問題なくエンドポイントとして公開、利用が可能でした。

まとめ

結果として、以下のことがわかりました。

  • API GatewayのVPC Linkで利用しているNLBを他のVPCのエンドポイントとして利用することは可能。
  • すでにエンドポインサービスとして利用しているNLBをAPI GatewayのVPC Linkに使うことはできない。

すでにエンドポインサービスとして利用しているNLBをVPC Linkでも使いたい場合は、新規にNLBを作成し、2つのNLBを併用するか既存のエンドポイントを移行する必要があるようです。