HTTP API のプライベート統合でプライベートサブネット内の Fargate API をコールする

HTTP API で Fargate の連携もめちゃ簡単!
2020.03.18

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

先日、API Gateway の HTTP API が GA をご紹介する記事を書きました。

今回は GA 版より追加されたプライベート統合を使って、プライベートサブネット内の ECS (Fargate) の API をコールするところまでを試してみます。

構成図

やりたいことは、以下の図のとおりです。HTTP API から VPC リンクを介して、プライベートサブネット内の NLB 配下の Fargate を API コールします。

事前準備

事前にプライベートサブネット内に Fargate 環境は構築済みです。

単純にポート番号 1234 で受けて、 Hello, Classmethod!! を返すだけのコンテナです。

$ curl localhost:1234
Hello, Classmethod!!

NLB は internal タイプで作成しています。

$ dig hello-nlb-f0e7cea11673ee77.elb.ap-northeast-1.amazonaws.com +short
192.168.3.192

VPC リンクの作成

HTTP API から内部 NLB が所属する VPC へアクセスするための VPC リンクを作成します。

API Gateway の管理コンソールから VPC links を開き、Create をクリック。

VPC リンクの作成画面が表示されます。今回は VPC link for HTTP APIs を選択し、任意の名前、リンクする VPC を選択します。次に、VPC リンクとして作成する ENI が所属するサブネットと、アタッチするセキュリティグループを選択します。

ここで指定するセキュリティグループは特にインバウンドルールは作成しなくてもアクセスできました。

じゃぁ何のためのセキュリティグループなんだろう?と考えましたが、VPC リンクの ENI へのアクセスを制御するというよりも、後段の ALB などで VPC リンクのセキュリティグループ ID を指定して許可設定する、といった用途に使うもなのかもしれませんね。

これで VPC リンクは完了です。

HTTP API の作成

API Gateway の管理コンソールから [APIs] を開き、Create API をクリックします。次に、[HTTP API] の Build をクリックします。

次に integrations の作成ですので、ここでプライベート統合を指定と思いきや、どうやら Create API のメニューのなかではプライベート統合の作成は出来ないようです。

よって、integrations も routes も空のまま Next で進めます。stage は $default と Auto-deploy を受け入れて Next。以下のように空っぽの API を作っただけの状態です。

プライベート統合の作成

API Gateway の管理コンソールから [Develop] - [Integrations] の Manage integrations タブを開き Create をクリックします。

Private resource を選択し、詳細に進みます。今回は NLB のた、ALB/NLB を選択し、Fargate がぶら下がっている NLB およびリスナーを指定します。最後に、先程作成した VPC リンクを指定し、Create で作成。

これでプライベート統合は作成できました。

あとは [Develop] - [Routes] から Create をクリックし、ルートを作成するだけです。例えば今回は GET / を作成します。

[integrations] に戻ると / GET が出来ていますのでこれを選択し、右のプルダウンメニューから先程作成したプライベート統合を指定し、Attach integration をクリック。

これで準備が整いました。

動作確認

以下の Invoke URL をキックして ECS の API コールから echo が返ることを確認します。

$ curl -i https://vbdkzblw7h.execute-api.ap-northeast-1.amazonaws.com
HTTP/2 200
date: Tue, 17 Mar 2020 22:37:38 GMT
content-type: text/plain; charset=UTF-8
content-length: 20
apigw-requestid: Jjmf4j5pNjMEMLQ=

Hello, Classmethod!!

パブリックな環境から、HTTP API を経由してプライベートサブネット内の Fargate の API をコールすることが出来てますね!

検証は以上です!

さいごに

今回は HTTP API の GA 版より追加になったプライベート統合を使って、VPC 内の Fargate の API をコールしてみました。REST API と比較すると、かなり楽ちんに設定できますね!

また、REST API で VPC リンクする場合、リンク先は NLB に限定されていましたが、HTTP API だと ALB/NLB/Cloud Map の 3 種類が利用できるのも嬉しいポイントですね!

以上!大阪オフィスの丸毛(@marumo1981)でした!