API GatewayをPrivateで作成してみる

AWS資格取得に向けて実際にAWSを利用してみるシリーズの投稿です。
今回はプライベートなAPIが作成できるAPI GatewayをPrivateで作成してみる編です。
API GatewayはGUI操作で比較的簡単にAPIを作成できるサービスなので今まであまり困ってはいなかったのですが、いざPrivateなAPI Gatewayを作ってみるといくつかのサービス連携があり、混乱してきたのでその整理をした投稿になります。
興味がある方は読んでみて下さい。

資格試験の勉強法は記事は以下を参照。

[AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/e5284a4ed3c3466ffd41 "AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法")
[AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/17fa401f4e46ecd00675 "AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法")


## 想定読者
* PrivateなAPI Gatewayを作成したい人


【公式ページ 手順】

* Amazon API Gateway でのプライベート API の作成
    * API Gatewayにプライベートアクセスさせるまでの設定


https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-apis.html

* API Gateway プライベート統合の設定
    * API Gatewayからバックエンドサービスに連携するまでの設定

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-private-integration.html

## 参考書籍

AWSのネットワークをしっかり学びたい人は次の本がおすすめです。

[AWSネットワーク入門 第2版 impress top gearシリーズ](https://www.amazon.co.jp/dp/B0BH7VT8P7?tag=aws_nw_001-22&linkCode=ogi&th=1&psc=1 "AWSネットワーク入門 第2版 impress top gearシリーズ")
<a href="https://www.amazon.co.jp/dp/B0BH7VT8P7?tag=aws_nw_001-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="noopener"><img border="0" src="https://m.media-amazon.com/images/I/51NL7q1gJrL._SL160_.jpg" ></a>

今なら、 <a target="_blank" href="https://www.amazon.co.jp/kindle-dbs/hz/subscribe/ku?ref_=sv_nav_ebook_4&amp;_encoding=UTF8&amp;shoppingPortalEnabled=true&_encoding=UTF8&tag=ranpage-22&linkCode=ur2&linkId=9c9aa821591f61643ba828e04d7bc776&camp=247&creative=1211">KindleUnlimited</a> でこの本が無料で読めます。
 <a target="_blank" href="https://www.amazon.co.jp/kindle-dbs/hz/subscribe/ku?ref_=sv_nav_ebook_4&amp;_encoding=UTF8&amp;shoppingPortalEnabled=true&_encoding=UTF8&tag=ranpage-22&linkCode=ur2&linkId=9c9aa821591f61643ba828e04d7bc776&camp=247&creative=1211">KindleUnlimited</a> は、たまにこの手の専門書籍が無料対象になるので、非常におすすめです。
 ネットワークに関わらずAWSの無料対象本も多くあるので、AWSの知識を深めたい方は、この機会を逃さずにぜひチェックしてみてください。

## 料金

結論から言うと料金がかかります。
API Gateway自体は基本的にAPI コールと転送データ量に対してのみ料金が発生するので個人運用であればほぼ0円なのですが、**PrivateとなるとPrivateLinkとNLBが必要**になってくるのでその時間料金が間違いなく発生します。主なものとして

* PrivateLinkの各AZのVPCエンドポイント1つあたりの料金 (USD/時間)：0.014USD
* NLB料金(USD/時間)：0.0243USD

の２つがあります。

作成しても使わない時は止めておけばいいというサービスではない（料金発生を防ぐためには削除する必要がある）ため常時料金が発生します。
ざっくり見積りは、

* PrivateLink：**10.22USD**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/4e716d88-f788-800c-4693-3befeac6f3fe.png)

* NLB：**17.74USD**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/98b5709a-fd39-1e44-2ee5-aec4a3d1075a.png)

です。



トラフィック量に依存する料金設定もあるのでその他詳細は以下の各ページを確認してください。

https://aws.amazon.com/jp/api-gateway/pricing/

https://aws.amazon.com/jp/privatelink/pricing/

https://aws.amazon.com/jp/elasticloadbalancing/pricing/


## Private API Gateway全体像

これが意外と理解できなく初めての構築は難航しました。。。
公式ページだと以下の図になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/48155449-ec07-0d75-ee38-b4dcba3aa865.png)

作ってみた結果、実体として以下のように頭の中を整理すると理解しやすくなると思います。今回の投稿はこの図がすべてです。この図を残しておきたく投稿してます。

【Private API Gateway サービス連携図】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/1791a388-ad08-cea2-7592-90aebb005e46.png)

ポイントは**２つ**

* PrivateなAPI GatewayとするためにAPI呼び出し元のフロント部Customer VPCにVPCエンドポイント（PrivateLink）が必要になります。（図[1]の部分）
* API受信側My VPCは、NLBと連携するためにAPI GatewayとNLBの間にVPCリンクが必要になります。（図[3]の部分）

つまり、PrivateなAPI Gatewayと言えど、自分達のMy VPC内に作られるのではなく、あくまで**Amazon API Gateway VPC上に作られるAPI GatewayをVPCエンドポイント（PrivateLink）とVPCリンクで繋ぐことでPrivateとしている仕組み**になります。
あとは図の通りですが、PrivateなAPI Gatewayを作る上で、以下の４つは意識した方がいいと思ったのでこんな図にしました。

１．VPCエンドポイント（PrivateLink）
２．API Gateway
３．VPCリンク
４．NLB

それではそれぞれのサービスとAWSコンソール上の設定画面を解説していきたいと思います。
（今回は詳細な構築手順は割愛してます^^;）



### １．VPCエンドポイント（PrivateLink）

まずはAWSコンソールのVPCのサービス画面からエンドポイントを作成します。
APIGatewayを作成する時にこのエンドポイントを指定する必要があるので事前に作成しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/62723ebe-256b-08c1-b438-147fcf2cc47e.png)

ポイントは２点あって、APIGatewayと連携するためには、

* エンドポイントタイプは、**Interface**
* サービス名は、**com.amazonaws.xxxxxxx.execute-api**

である必要があります。


### ２．API Gateway

次はAPIGatewayの作成になります。作成時の画面遷移の中でエンドポイントタイプやエンドポイントを設定することになりますが、作成後の画面だと**設定**メニューの**エンドポイントの設定**で確認、変更が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/e5324185-b61a-78fc-d3fd-62b1c7eff74d.png)

「１．VPCエンドポイント（PrivateLink）」で作成したVPCエンドポイントを指定します。

### ３．VPCリンク、４．NLB

続いてVPCリンクの作成とNLB設定になります。
この２つはほぼ同時設定となるので一緒に記載します。

まずVPCリンクは、APIGatewayの**VPCリンク**のサービスメニューから作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/6e03d763-5dc1-f9f2-774c-55a45100bfbe.png)

VPCリンク作成時にターゲットNLBを設定する必要があるので設定します。
そのため、事前にNLBを作成しておく必要があるのですが、今回NLBの作成は本質ではないため割愛します。

ここまでがAPIGatewayサービスの全体の中にVPCリンクを作成したイメージになります。
次に今回作成した該当のAPIGatewayにVPCリンク、NLBを登録します。
それは以下のように各APIGatewayのメソッド単位で行います。（今回はPOSTメソッドに設定したイメージになります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/c26851e5-3970-34ec-7d59-7164d0173dfd.png)

統合タイプを**VPCリンク**にして、VPCリンクに**先に作成したVPCリンク**を設定、エンドポイントURLに**NLBのFQDN／バックエンドWebサービスのパスを含むURL**を設定します。
以上で一連のサービス連携設定が完了です。

APIGatewayで設定変更したら忘れずにステージを指定してデプロイしましょう。デプロイ後に該当ステージで発行されるURLにリクエストを送ると無事に VPCエンドポイント（PrivateLink） -> API Gateway -> VPCリンク -> NLB と連携され、バックエンドWebサービスにアクセスできると思います。

## まとめ

今回はPrivateなAPI Gatewayの整理でした。いくつかのサービスが連携されているので意外と混乱するのではないでしょうか？
（実はNLBの中にVPCエンドポイントサービスの連携もありNLBを含めるとさらに混乱します。。。）
最初に書きましたが、今回は【Private API Gateway サービス連携図】がすべてなので作成する時にはこの図をイメージして作成するとスムーズにいくかなと思います。

ここまで読んで頂き、ありがとうございました！

## 資格取得に向けてAWSサービスを実際に利用してみるシリーズの投稿一覧

[とりあえず30分でAWS利用料金の高額請求に備える～予算アラート設定・MFA・料金確認～](https://qiita.com/fkooo/items/67c53c997508e25605ea "とりあえず30分でAWS利用料金の高額請求に備える～予算アラート設定・MFA・料金確認～")
[AWS ECSでDocker環境を試してみる](https://qiita.com/fkooo/items/d7d98e16e91921508450 "AWS ECSでDocker環境を試してみる")
[Amazon Cognitoを使ってシンプルなログイン画面を作ってみる](https://qiita.com/fkooo/items/660cab0090a80861155b "Amazon Cognitoを使ってシンプルなログイン画面を作ってみる")
[AWS NATゲートウェイを使ってプライベートサブネットからインターネットにアクセスする](https://qiita.com/fkooo/items/a474db0f3c2e72448d36 "AWS NATゲートウェイを使ってプライベートサブネットからインターネットにアクセスする")
[API GatewayをPrivateで作成してみる](https://qiita.com/fkooo/items/577831abd9803eb91b16 "API GatewayをPrivateで作成してみる")（本記事）
[AWSのAI(Rekognition/Polly/Transcribe/Comprehend/Translate/Textract)サービスを試してみる](https://qiita.com/fkooo/items/10f75bafd08c60fc0a66 "AWSのAI(Rekognition/Polly/Transcribe/Comprehend/Translate/Textract)サービスを試してみる")
[AWS Lambda 同時実行数、エイリアス、環境変数とか実際の現場で使える機能を勉強してみる](https://qiita.com/fkooo/items/1b24e01252e145a378db "AWS Lambda 同時実行数、エイリアス、環境変数とか実際の現場で使える機能を勉強してみる")
[AWS Lambda SAMとは？～AWS SAMを使ってPythonのLambdaプログラムを簡単に作成する～](https://qiita.com/fkooo/items/2dc5ded5149379d7305a "AWS Lambda SAMとは？～AWS SAMを使ってPythonのLambdaプログラムを簡単に作成する～")
[Cloud9でAWS Amplifyの公式チュートリアルGetting startedをやってみる](https://qiita.com/fkooo/items/84f8f57e2317b0973496 "Cloud9でAWS Amplifyの公式チュートリアルGetting startedをやってみる")