AWS Lambda：API GatewayとApplication Load Balancerの違い

AWS Lambdaを使ってサーバーレスでWeb APIを作る場合、Lambdaの呼び出し元としてAPI Gateway (API GW) もしくはApplication Load Balancer (ALB) のどちらかを選択することになる。この選択基準となる両者の違いを整理した。

API Gateway特有の機能

- 当然ながら、ALBではAPI Gatewayの[リクエスト検証](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-method-request-validation.html)、[データマッピング](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/mappings.html)、[アクセス制御](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)、[SDK生成](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-generate-sdk.html)といった機能は使えない。

プロトコル・ポート番号

* API GWは443番でのHTTPS (TLS 1.2) のみをサポートする。（[VPC Endpoint経由での呼び出し](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-apis.html)はできるが、この場合でもHTTPSのみとなる。）
* ALBは任意のポート番号でのHTTP/HTTPS（TLSバージョンも[選択肢](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html#describe-ssl-policies)がある）をサポートする。

実行可能時間（タイムアウト時間）

* API GWは[最長29秒まで](https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#api-gateway-limits)と制約が厳しい。
* ALBは[Lambdaのタイムアウトまで](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#prepare-lambda-function)（最大15分）処理を続けることができる。

リクエスト・レスポンスサイズ

* API GWでは、[Lambdaの最大ペイロードサイズ](https://docs.aws.amazon.com/lambda/latest/dg/limits.html)（6MB）が上限となる。
  * ペイロードサイズはLambdaのリクエスト・レスポンスとなるため、ヘッダやBase64エンコードされたボディを含む合計値となる。
  * API GW自体の[最大ペイロードサイズは10MB](https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#api-gateway-limits)となる。

* ALBでは、リクエストボディは最大1MB（超過時は[413エラー](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html#http-413-issues)）、レスポンスボディも最大1MB（超過時は[502エラー](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html#http-502-issues)）となる。

Request Event（[参考](https://serverless-training.com/articles/api-gateway-vs-application-load-balancer-technical-details/#application-load-balancer-request-event-format-differences)）

* evt.headers (Request)
  * API GWでは大文字小文字を区別した状態で設定するが、ALBではヘッダ名は小文字化された状態で設定する。
* evt.queryStringParameters (Request)
  * クエリストリングが指定されない場合、API GWは `null` を設定するが、ALBは `{}` を設定する。
  * クエリストリングのキー・バリューについて、API GatewayはURLデコードされた状態で設定するが、ALBはデコード前の状態で設定する。
* evt.multiValueHeaders / evt.multiValueQueryStringParameters (Request)
  * API GWではデフォルトで設定されるが、ALBでは設定で有効化する必要がある。

Response Event（[参考](https://serverless-training.com/articles/api-gateway-vs-application-load-balancer-technical-details/#application-load-balancer-response-event-format-differences)）

* ALBではstatusDescription、isBase64Encoded、headers（Multi Value Headerを有効化している場合はmultiValueHeder）の指定が必須となる。

コスト

* 一定のリクエスト頻度までであれば、時間課金があるALBよりも実行回数による課金であるAPI GWの方が安いが、大量のリクエストを受ける場合はALBの方が安くなる。（[参考](https://serverless-training.com/articles/save-money-by-replacing-api-gateway-with-application-load-balancer/)）

#### 参考

* [Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/lambda-functions-as-targets-for-application-load-balancers/)
  * `Amazon API GatewayがLambda関数をトリガするために使用するパラメータとALBのパラメータとの間には、多くのオーバーラップと共通性があります。 `としか記述されていない。
* [API Gateway vs Application Load Balancer—Technical Details](https://serverless-training.com/articles/api-gateway-vs-application-load-balancer-technical-details/)
* [API Gateway vs. ALB - 持田システム](http://www.motidasystem.com/tech/aws/201901271852.html)
  * 実行可能処理時間と返却可能レスポンスサイズの違いについて解説されている。