AWS
ElasticBeanstalk
vpc
ElasticLoadBalancing
APIGateway

VPC内のPrivateリソースにAPIGateway経由でアクセスする

tl;dr;

VPC内にNLBで展開すれば,VPC integrationを使って,API GatewayでVPC内で動作しているinternalなAPIサーバを叩くことができる.

やりたいこと

これは過去の話ですが,APIGateWayを通してのリクエストを実装する時,Lambdaや直接外部に公開しているエンドポイント経由で叩くといった方法がありますが,それらはVPC内のリソースを叩くことができませんでした.

そこで,VPC integrationという機能が2017 12月くらいに発表されました.これは,その名の通り(?)API Gatewayの統合レスポンスとして特定のVPCを指定することができます.VPCはprivateなsubnetだとしても指定可能なので,実装したAPIサーバーへのアクセスをAPI Gateway経由でのみできるようになります.

この記事ではこの方法を解説したいと思います.

手順

1.VPCを作成する

  • VPCを作成します.
  • public / privateなサブネットに切るなどありきたりな構成で問題ないです.

2.VPC内にEC2インスタンスを立てる.

  • ここに,実装したAPIサーバーを展開するといいです.
  • VPCのprivate subnetに展開するといいと思います.

3.ELBをつくる.

  • ここからが本番です.
  • NLB(Network Load Balancer)を選択してください.

ELB

  • これの真ん中のやつです.
  • NLBでないとAPI GateWayから叩く事ができないので注意してください.
  • 上で作成したEC2をこのロードバランサーにぶら下げてください.

a.余談

  • ここまでの流れをElasticBeanstalkで作成するなら,eb cliを使うことをおすすめします.
  • eb cliでは展開するVPCやAZを選択できたり,ELBのタイプも--elb-type networkとするだけで簡単に作成できます.また,defaultでinternalなものが作成できるので繁雑なウェブコンソールを使うよりもこちらのほうがおすすめです.

4.VPC リンクをつくる.

  • API GatewayのウェブコンソールにVPCをリンクというタブがあるのでこれを選択します.
  • すると下の図のような画面がでるので,適当な名前,説明を振り,先程作成したNLBを選択します.

vpclink

  • VPCリンクの作成がわりと遅いのでお茶でも飲みながら待ちます.

5.API Gatewayを作成する.

  • swaggerとかで読み込むなり,自分で頑張ってぽちぽちするなりしましょう.
  • 統合リクエストを編集します.あるリクエストの統合リクエストを見ると以下のような画面になります.

api gateway

  • ここで統合タイプでVPCリンクを,その下のVPCリンクでは先程,上で作成したものを選択します.
  • 正しく動作するかは,「テスト」を使うといいです.単純にパススルーするわけではなくヘッダを変更したり,認証はさんだりするケースがあると思うのでそれらの挙動が正しいかを調べるためにもこれは効果的です.(レスポンスがどう処理されているかが見えるのでハッピー)

完成

  • 完成です.これでlambda等を使うことなく,VPCを叩く事ができるようになりました.

なにが嬉しいの?

  • APIサーバーを完全にinternalにできる.
    • 不用意に外に晒すの怖い><
    • API Gatewayで適切な認証を噛ますことも可能.

参考

【新機能】API Gateway VPC integrationを使ってみた #reinvent | Developers.IO
Amazon API Gateway でプライベート VPC とのエンドポイント統合をサポート - AWS