コンテンツにスキップ

Amazon API Gateway@AWS リソース

はじめに

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


01. Amazon API Gateway とは

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

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

Amazon API Gatewayの仕組み


02. セットアップ

コンソール画面の場合

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

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

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

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

▼ OpenAPI 仕様のインポート

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

▼ CORS の突破

正しいリクエストが CORS を突破できるように、異なるオリジンによって表示されたページからのリクエストを許可する。


プライベート統合

▼ プライベート統合とは

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

また、Amazon VPC リンクを設定することで、Amazon VPC エンドポイントサービスを作成する。

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

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


AWS Lambda プロキシ統合

▼ AWS Lambda プロキシ統合とは

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

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

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

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

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

Amazon API Gateway 側でプロキシ統合を有効化すると、Amazon 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",
}

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

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

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

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

Amazon 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 の作成


デプロイメント

▼ 通常のデプロイメント

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

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

▼ カナリアリリース

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

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


ログの種類

▼ 実行ログ

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

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

▼ カスタムアクセスログ

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

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


分散トレースの収集

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

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

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

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


API の設定

▼ エンドポイントタイプ

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


03. AWS Lambda オーソライザー

Amazon API Gateway の認証プロキシと中央集権的な認可プロバイダーとして機能する。

ID プロバイダーが別途必要である。

似たものとして AWS Cognito オーソライザーがある。

これを使用する場合は AWS Lambda オーソライザーを使用できない。

aws_api-gateway_lambda_authorizer

AWS Cognito オーソライザー AWS Lambda オーソライザー
認証
認可