コンテンツにスキップ

AWS API Gateway@AWSリソース

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. AWS API Gatewayとは

異なるクライアントからのリクエストを受信して差分を吸収し、適切なAPIに振り分けられる。

内部的にはCloudFrontを使用しているらしい。

AWS API Gatewayの仕組み


02. セットアップ

コンソール画面の場合

AWS API Gatewayは、メソッドリクエスト、統合リクエスト、統合レスポンス、メソッドレスポンス、から構成される。

設定項目 説明 補足
リソース エンドポイント、HTTPメソッド、ルーティング先などを設定する。 作成したAWSリソースのパスが、AWS API Gatewayのエンドポイントになる。
ステージ AWS API Gatewayをデプロイする環境を定義する。
オーソライザー AWS LambdaまたはCognitoによるオーソライザーを使用して、認可プロセスを定義する。
ゲートウェイのレスポンス
モデル リクエスト/レスポンスのスキーマを設定する。これらのバリデーションのために使用できる。 OpenAPI仕様におけるスキーマについては、以下のリンクを参考にせよ。
https://hiroki-it.github.io/tech-notebook/software/software_application_messaging_api_restful.html
リソースポリシー ポリシーを使用して、AWS API Gatewayにセキュリティを定義づける。
ドキュメント
ダッシュボード
APIの設定
使用サイズプラン 有料サービスとしてAPIを公開し、料金体系に応じてリクエストサイズを制限するために使用する。APIキーにリクエスト量のレートを設定する。 有料サービスとして使用しないAPIの場合は、レートを設定する必要はない。
APIキー APIキー認証を設定する。 ・その他のアクセス制御の方法として、以下がある。
https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html
クライアント証明書 SSL証明書をAWS API Gatewayに割り当てる。 APIが、AWS API Gatewayからルーティングされたリクエストであること識別できるようになる。
AWS CloudWatchログの設定 AWS API GatewayがAWS CloudWatchログにリクエストを送信できるよう、ロールを設定する。 1個のAWSアカウントにつき、1個のロールを設定すれば良い。


リソース

▼ リソース

順番 処理 説明 補足
1 メソッドリクエスト クライアントから受信したデータのうち、実際にルーティングするデータをフィルタリングする。
2 統合リクエスト メソッドリクエストからルーティングされた各データを、マッピングテンプレートのJSONに紐付ける。
3 統合レスポンス 統合リクエストでプロキシ統合を使用する場合、統合レスポンスを使用できなくなる。
4 メソッドレスポンス レスポンスが成功した場合、クライアントに送信するステータスコードを設定する。

▼ メソッドリクエスト

設定項目 説明 補足
認可 定義したAWS LambdaまたはCognitoによるオーソライザーを有効化するか否かを設定する。
リクエストの検証 『URLクエリ文字列パラメーター』『HTTPリクエストヘッダー』『リクエスト本文』のバリデーションを有効化するか否かを設定する。
APIキーの必要性 リクエストヘッダーにおけるAPIキーのバリデーションを実行する。リクエストのヘッダーに『x-api-key』を含み、これにAPIキーが割り当てられていることを強制する。 ヘッダー名は大文字でも小文字でも問題ないが、小文字が推奨。
https://hiroki-it.github.io/tech-notebook/software/software_application_messaging_api_restful.html
URLクエリ文字列パラメーター リクエストされたURLのクエリパラメーターのバリデーションを実行する。
HTTPリクエストヘッダー リクエストヘッダーのバリデーションを実行する。
リクエスト本文 リクエストボディのバリデーションを実行する。
SDK設定

▼ 統合リクエスト

設定項目 説明 補足
統合タイプ リクエストのルーティング先を設定する。
URLパスパラメーター メソッドリクエストからルーティングされたデータを、AWS API Gatewayからルーティングするリクエストのパスパラメーターに紐付ける。代わりに、紐付けずに新しいデータをルーティングしても良い。
URLクエリ文字列パラメーター メソッドリクエストからルーティングされたデータを、AWS API Gatewayからルーティングするリクエストのクエリパラメーターに紐付ける。代わりに、紐付けずに新しいデータをルーティングしても良い。
HTTPヘッダー メソッドリクエストからルーティングされたデータを、AWS API Gatewayからルーティングするリクエストのヘッダーに紐付ける。代わりに、紐付けずに新しいデータをルーティングしても良い。 値はシングルクオートで囲う必要がある。
マッピングテンプレート メソッドリクエストからルーティングされたデータを、AWS API Gatewayからルーティングするリクエストのメッセージボディに紐付ける。代わりに、紐付けずに新しいデータをルーティングしても良い。

▼ ホワイトボックステスト

設定項目 設定例 補足
クエリ文字
ヘッダー X-API-Token: test 波括弧、スペース、クオーテーションは不要。
リクエスト本文 {test:"test"} 改行タグやスペースが入り込まないようにする。

▼ OpenAPI仕様のインポート

以下のリンクを参考にせよ。

▼ CORSの有効化

CORSを有効化し、異なるオリジンによって表示されたページからのリクエストを許可する。

以下のリンクを参考にせよ。


プライベート統合

▼ プライベート統合とは

AWS API GatewayとAWS VPCリンクの間で、リクエスト/レスポンスのJSON型データを自動的にマッピングする機能のこと。

また、AWS VPCリンクの設定によって、AWS VPCエンドポイントサービスを作成する。

設定項目 説明
統合タイプ AWS VPCリンクを選択する。
プロキシ統合の使用 AWS VPCリンクとのプロキシ統合を有効化するか否かを設定する。
メソッド HTTPメソッドを設定する。
AWS VPCリンク AWS VPCリンク名を設定する。
エンドポイントURL NLBのDNS名をドメイン名として、転送先のURLを設定する。
デフォルトタイムアウトの使用

▼ メソッドリクエストと統合リクエストのマッピング


AWS Lambdaプロキシ統合

▼ AWS Lambdaプロキシ統合とは

AWS API GatewayとAWS Lambdaの間で、リクエスト/レスポンスのJSON型データを自動的にマッピングする機能のこと。

プロキシ統合を使用すると、AWS Lambdaに送信されたリクエストはハンドラ関数のeventオブジェクトに代入される。

プロキシ統合を使用しない場合、AWS LambdaとAWS API Gatewayの間のマッピングを手動で実行する必要がある。

設定項目 説明
統合タイプ AWS Lambda関数を選択する。
AWS Lambdaプロキシ統合の使用 AWS Lambdaとのプロキシ統合を有効化するか否かを設定する。
AWS Lambdaリージョン 実行したAWS Lambda関数のリージョンを設定する。
AWS Lambda関数 実行したAWS Lambda関数の名前を設定する。
実行ロール 実行したいAWS Lambda関数への認可スコープが紐付けられたロールのARNを設定する。ただし、AWS Lambda側にAWS API Gatewayへの認可スコープを紐付けしても良い。
認証情報のキャッシュ
デフォルトタイムアウトの使用

▼ リクエスト時のマッピング

AWS API Gateway側でプロキシ統合を有効化すると、AWS API Gatewayを経由したクライアントからのリクエストは、ハンドラ関数のeventオブジェクトのJSON型データにマッピングされる。

{
  "resource": "Resource path",
  "path": "Path parameter",
  "httpMethod": "Incoming request's method name",
  "headers": {
      String
      containing
      incoming
      request
      headers,
    },
  "multiValueHeaders": {
      List
      of
      strings
      containing
      incoming
      request
      headers,
    },
  "queryStringParameters": {
      query
      string
      parameters,
    },
  "multiValueQueryStringParameters": {
      List
      of
      query
      string
      parameters,
    },
  "pathParameters": {
      path
      parameters,
    },
  "stageVariables": {
      Applicable
      stage
      variables,
    },
  "requestContext": {
      Request
      context
      including
      authorizer-returned
      key-value
      pairs,
    },
  "body": "A JSON string of the request payload.",
  "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encoded",
}

▼ レスポンス時のマッピング

AWS API Gatewayは、AWS Lambdaからのレスポンスを、以下のJSON型データにマッピングする。

これ以外の構造のJSON型データを送信すると、AWS API Gatewayで『Internal Server Error』のエラーが起こる。

{
  "isBase64Encoded": "true",
  "statusCode": httpStatusCode,
  "headers": {"headerName": "headerValue", ...},
  "multiValueHeaders":
    {"headerName": ["headerValue", "headerValue2", ...], ...},
  "body": "Hello AWS Lambda",
}

AWS API Gatewayは上記のJSON型データを受信した後、bodyのみ値をレスポンスのメッセージボディに持たせ、クライアントに送信する。

"Hello AWS Lambda"


ステージ

▼ 設定

設定項目 説明
キャッシュ設定 https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-caching.html
デフォルトのメソッドスロットリング リクエスト数 (個/秒) 制限を設定する。
https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html
AWS WAF https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html
クライアント証明書 紐付けるAWS WAFを設定する。

▼ ステージ変数

デプロイされるステージ固有の環境変数を設定できる。

AWS Lambda関数名、エンドポイントURL、パラメーターマッピング、マッピングテンプレートで値を出力できる。

以下のリンクを参考にせよ。

▼ SDKの作成


デプロイメント

▼ 通常のデプロイメント

AWS API Gatewayの通常のデプロイメントの仕組みは隠蔽されている。

ダウンタイム無しで、新しいステージをデプロイできる。

▼ カナリアリリース

カナリアリリースを使用して、新しいステージをデプロイする。

設定項目 説明
ステージのリクエストディストリビューション
Canaryのデプロイ
Canaryステージ変数
キャッシュ


ログの種類

▼ 実行ログ

AWS CloudWatchログにAWS API Gatewayの実行ログを送信するか否かを設定できる。

リクエスト/レスポンスの構造もログに出力するようにした方が良い。

▼ カスタムアクセスログ

AWS CloudWatchログにAWS API Gatewayのアクセスログを送信するか否かを設定できる。

アクセスログを構造化ログとして出力できる。


分散トレースの収集

X-Rayを使用して、AWS API Gatewayを開始点とした分散トレースを収集する。

まず、AWS API GatewayでトーレスIDを作成する。

その後、各AWSリソースでスパンを取得し、スパンを紐付けることより、分散トレースを表現できる。

補足としてX-Rayでは、親スパンをセグメント、子スパンをサブセグメントと呼ぶ。


APIの設定

▼ エンドポイントタイプ

タイプ名 説明
リージョン AWS API Gatewayのエンドポイントに対するリクエストを、リージョン内の物理サーバーで受け付ける。
プライベート AWS API Gatewayのエンドポイントに対するリクエストを、AWS VPC内からのみ受け付ける。
エッジ最適化 AWS API Gatewayのエンドポイントに対するリクエストを、CloudFrontのエッジサーバーで受け付ける。