【AWS】API Gatewayをリバースプロキシサーバーとして使用する
とあるAPIを別ドメインのURLで使用したいという話があり、試験的にAPI Gatewayをただ単にリバースプロキシサーバーとして使用してみたので、備忘録として残しておく。
概要
https://aaa.com/api
:クライアントがアクセスするURLhttps://bbb.com/api
:実際に使いたいAPIのURL
実際に使いたいAPIのURLhttps://bbb.com/api
のbbb.com
のドメインではなく、aaa.com
のドメインでAPIを使えるようにする。
Amazon API Gatewayとは
Amazon API Gateway は、あらゆる規模の REST、HTTP、および WebSocket API を作成、公開、維持、モニタリング、およびセキュア化するための AWS のサービスです。
システム構成
今回は上記のようなシステムを構成する。Route 53へのドメインの登録、ACMでのSSL証明書の発行に関しては、説明を省略し、すでに登録および発行がされていることを前提として、API Gatewayの設定のみを説明する。
APIの作成
- APIタイプを選択
- 「HTTP API」を選択して構築
STEP1:APIの作成
- 統合:「統合を追加」を押す
HTTP 統合を選択し、API Gateway は指定した URL にリクエストを送信し、その URL からのレスポンスで応答するようにする。
- 統合種別:HTTP
- メソッド:ANY
- URLエンドポイント:
https://bbb.com
- API名:API-Reverse-Proxy(任意の名前を設定)
- 統合:「統合を追加」を押す
HTTP 統合を選択し、API Gateway は指定した URL にリクエストを送信し、その URL からのレスポンスで応答するようにする。
STEP2:ルートを設定(操作不要。確認のみ)
- メソッド:(選択不可)
- リソースパス:
$default
- 統合ターゲット:ANY
https://bbb.com
HTTP全てのメソッド・全てのパスに対して、
https://bbb.com
にリクエストを送信する。その場合、パスに$default
を設定する。(API ごとに「$default」ルートを 1 つ指定することもできる。「$default」ルートは、API へのリクエストと一致するルートが他に存在しない場合に呼び出される。)STEP3:ステージを定義(操作不要。確認のみ)
- ステージ名:
$default
個別設定などは不要なので、ステージの追加はしない
- ステージ名:
STEP4:確認して作成
カスタムドメイン名の設定
カスタムドメインの作成
- ドメイン名の詳細
- エンドポイント設定
- タグ:(必要であれば追加)
作成すると、ドメイン名が正常に作成される。
「API Gateway ドメイン名」は後ほどRoute 53に登録する際に必要となるので、確認だけしておく。(Route 53では選択するのみなので、リージョンの確認だけしておけば問題なし。)
API マッピングの設定
「API マッピングを設定」から「新しいマッピングを追加」する。
- API:先ほど作成した「API-Reverse-Proxy」を選択
- ステージ:
$default
しかないので、$default
を選択 - パス(オプション):空欄 パスを設定することで、特定のパスに対するAPIやステージの設定が可能となる
Route 53でAliasレコードを作成
カスタムドメインに追加したドメインのRoute 53のホストゾーンにAliasレコードを追加する。
- レコード名:(空欄のまま)
- レコードタイプ:A - IPv4アドレスと一部のAWSリソースにトラフィックをルーティングします。
- エイリアス有効
- トラフィックのルーティング先:API Gateway API へのエイリアス
- リージョン:カスタムドメインの「API Gateway ドメイン名」のリージョンを選択する
- ドメイン名:カスタムドメインの「API Gateway ドメイン名」を選択する
デフォルトエンドポイントの無効化
現時点の設定では、以下の2つのURLからAPIを呼び出すことができる
APIの詳細を編集から、デフォルトのエンドポイントを「有効」から「無効」に変更する。
まとめ
Amazon API Gatewayは初めて使ってみたが、設定もわかりやすく、非常に簡単であった。いろいろな箇所で応用できそうであると思ったので、今度はLambdaと連携するなどしていきたいと思えた。
金額感的にも、HTTP APIであれば、最初の3億回/月までは1.00USDとかなり割安であるように思えた。