API Gatewayとは?
LambdaやEC2等のバックエンドへのAPIを提供するサービスです。APIの管理や実行を容易にする仕組みです。アプリからAPIリクエストを受け付けるエンドポイント(Webhook URL)として構築する。
APIの管理面ではリソース(usersなど)とメソッド(POSTなど)の組み合わせによりAPIを作成できます。
設計例
一番よくあるAPIGateway + Lambdaであれば以下のような作りになります。

ステージ
APIをデプロイする環境名を指します。API Gatewayにリクエストする際はURLにこのステージ名を含めてリクエストします。(例:https://ドメイン名/ステージ名/users?id=001)
マッピングテンプレート
HTTPリクエストのリクエストパラメータをLambda関数内で利用できるように整形するためのテンプレートを指します。
例えば、以下のようにJSON形式で定義しておけばURLパラメータをlambda関数内で利用できるようになります。
1 |
{"id": "$input.params["id"]"} |
基本的な機能
バックエンドを呼び出す。
呼び出すバックエンドとしては下記のように様々なサービスを呼び出すことが可能です。
- Lambda関数
- EC2
- その他AWSサービス
- 外部リソース
REST API
「構築」をクリックします。

「新しいAPI」にチェックをいれる。

任意のAPI名を入力して右下の「APIの作成」をクリックします。

「アクション」→「リソースの作成」をクリックします。

任意のリソース名を入力して「リソースの作成」をクリックします。

メソッドの作成
「アクション」→「メソッドの作成をクリックします。

リソースの下にプルダウンが表示されるので「POST」を選び「チェックマーク」をクリックします。

APiが呼ばれた際に紐づけたいLambda関数名(以下例でいえばusers-post-function)を入力して「保存」を押します。

以下のようにAPIがリクエストした後の流れが表示されます。マッピングテンプレートの作成をするために「統合リクエスト」をクリックします。

マッピングテンプレートの作成(リクエストパラメータをLambda関数で取得できるようにするために)
「マッピングテンプレートの追加」をクリックする。

Content-Typeに「application/json」を入力します。

以下のポップアップが出てきますが、「はい、この統合を保護します」をクリックします。

以下マッピングテンプレートの入力欄が出てくるので以下入力して「保存」します。(リクエストパラメータのbody部を取得してエスケープするという処理内容になっています。)
1 2 3 |
{ "body" : "$util.escapeJavaScript($input.body)" } |
「アクション」→「APIのデプロイ」を選択してAPIをデプロイします。

以下のようにデプロイ先のステージを作成して、デプロイします。

そうすると以下のようにAPIを呼び出すためのURLが発行されます。

Web Sockets

APIの設定、デプロイ
認証、認可、アクセス制御
流量制御と保護(スロットリング)
流量制御の他、バックエンドを保護するためのスロットリング等もあります。
キャッシング
キャッシングしてバックエンドの負荷を低減することも可能です。
エンドポイントタイプ
「REST API」の場合のみエンドポイントを3種類から選択することが可能です。
エッジ最適化
- REST APIのみ
- Publicに公開される。
- 一旦エッジロケーション(CloudFront)にルーティングされる。
リージョン
- REST API、HTTP API、WebSocketで利用できる。
- Publicに公開される。
- リージョンに直接ルーティングされる。(リクエスト元が同一ならレイテンシを削減できる。)
プライベート
- REST APIで利用できる。
- Publicからのアクセスはできず保護できる。
- VPCエンドポイント経由でのみアクセスが可能
サービスプロキシ機能
APIをプロキシとして受ける機能です。これを使えば例えばLambdaファンクションを非同期に呼び出すといったことも可能になります。バックエンドはLambdaを元、SQS、Kinesis等の幅広いAWSサービスを送付先とすることが可能です。
API処理別設計思想
取得系(GET系)の場合
API GatewayでキャッシュするようにしてなるべくバックエンドのLambdaを呼び出すことなくレスポンスを返せるのでそのようにするのが良いです。
更新系(PUT系)の処理
AWS Lambdaで直接記述するのではなく、API Gatewayはサービスプロキシとして構成することも可能なのでAmazon SQS、Amazon Kinesis(一旦バッファリングするようなサービスたち)に流すようににしてイベント処理として非同期でLambdaで処理していくようにすると良いです。
この記事へのコメントはありません。