API Gatewayとは
API Gatewayは、完全マネージドのAPI作成サービス。受信したAPIコールと送出したデータ量に対して課金される。スロットリングによるトラフィック管理ができるため、DDoSやトラフィックの激増にも対応することが可能であり、リミットを超えたリクエストにはHTTPステータス 429が返却される。また、レスポンスはキャッシュ可能であり、レイテンシやトラフィック等を低減することができる。
API Gatewayは、IAMやCognitoを用いたアクセス認証、署名付きAPIコールなどを使用することができるために柔軟にセキュリティ管理ができる。また、CloudWatchやCloudWatch Logsを用いた監視が可能で効率的なデバッグとモニタリングを実現している。
![API Gateway]https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/BackplaneArch.png
エンドポイント
API Gatewayは、特定のリージョンにデプロイされる。エンドポイントは以下の3種類がサポートされている。エンドポイントは、HTTPSのみサポートされている。
種類 | 内容 |
---|---|
エッジ最適化 | CloudFrontネットワークにデプロイ |
リージョン | リージョンにデプロイ。EC2 インスタンスまたは API と同じリージョン内のサービスから送られる場合に使用すると良い。 |
プライベート | VPCからのみアクセス可能 |
リソースとメソッド
APIは階層構造となっており、リソースやメソッドをネストすることも可能。指定可能なメソッドは以下の通り。
種類 | 実行内容 |
---|---|
POST | 子リリースの作成 |
PUT | 既存リソースの更新 |
DELETE | リソースの削除 |
PATCH | リソースの更新 |
HEAD | テストシナリオに使用 |
OPTIONS | 通信オプションに関する情報を取得する度に使用できる |
CROSを有効にするためには、OPTIONSメソッドのプリフライトリクエストに対してAPIが応答することが必要であり、このリクエストに対して、HTTPステータス 200とAccess-Control-Allow-Method, Access-Control-Allow-Headers, Access-Control-Max-Ageヘッダを含んだレスポンスを返す。これらの挙動には、統合リクエスト/レスポンスのMockタイプを使用する。
リクエストに対して、 URLクエリ文字列パラメータやHTTPヘッダ、HTTPボディを検証し、必須の項目が含まれているかやキャッシュを行うかなどを指定することができる。HTTPボディがapplication/json形式である場合は、JSON Schemaを用いてJSON形式を指定することもできる。
統合リクエスト/レスポンスとマッピングテンプレート
API Gatewayとバックエンドとを接続する内部インタフェース。マッピングテンプレートを用いることで、フロントエンド(API Gateway)とバックエンドのデータ形式を変換することができる。
- Lambda関数の呼び出し
- 他のAWSサービスの呼び出し
- HTTPウェブサイトのアクセス
の3つのバックエンドへのアクセスに対応している。Lambdaプロキシ統合を用いることで、API GatewayとLambdaがより協力に結合され、リクエストヘッダやパス変数などがLambdaに渡される。また、HTTPプロキシとして使用することも可能である。
デプロイ
APIを利用可能とするためには、APIのリソースおよびメソッドのスナップショットであるAPIのデプロイを実施する必要がある。APIをバージョン管理できるために、新しいバージョンを簡単にテストしリリースすることが可能である。
1アカウント1リージョンあたりのAPIの上限は、10000RPSである。これ以上のアクセス負荷にも耐えうる値とする場合は上限緩和申請が必要となる。
エラーコード
API Gateway の代表的なレスポンスコードは以下の通り。
エラーコード | レスポンスタイプ | 内容 |
---|---|---|
400 | BAD_REQUEST_PARAMETERS | リクエストパラメータの不整合 |
400 | BAD_REQUEST_BODY | リクエストボディの不整合 |
401 | UNAUTHORIZED | 認証の失敗 |
403 | EXPIRED_TOKEN | トークンの期限切れ |
403 | ACCESS_DENIED | 認証の失敗 |
403 | INVALID_API_KEY | APIキーの不整合 |
403 | INVALID_SIGNATURE | 署名の不整合 |
403 | MISSING_AUTHENTICATION_TOKEN | トークンが見つからない |
403 | WAF_FILTERED | WAFによるブロック |
404 | RESOURCE_NOT_FOUND | リクエスト先が存在しない |
413 | REQUEST_TOO_LARGE | リクエストが大きすぎる |
415 | UNSUPPORTED_MEDIA_TYPE | メディアタイプの相違 |
429 | QUOTA_EXCEEDED | クオータの超過 |
429 | THROTTLED | スロットルの発生 |
500 | API_CONFIGURATION_ERROR | API 設定が無効 |
500 | AUTHORIZER_CONFIGURATION_ERROR | オーソライザーへの接続が失敗 |
500 | AUTHORIZER_FAILURE | オーソライザーの認証が失敗 |
504 | INTEGRATION_FAILURE | 統合に失敗 |
504 | INTEGRATION_TIMEOUT | 統合のタイムアウト |