【レポート】API Gatewayがそんなことしてたなんて知らなかった #SVS212 #reinvent

2019.12.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部のKyoです。

AWS re:Invent 2019のセッション「I didn’t know Amazon API Gateway did that (SVS212)」についてレポートします。

登壇者

Eric Johnson - Senior Developer Advocate - Serverless, Amazon Web Services

概要

This session is an introduction to Amazon API Gateway and the problems it is solving. We walk through the moving parts of API Gateway, giving examples of possible use cases both common and not so common. You come away with a solid understanding of why you should use API Gateway and what it can do.

コンテンツ

API Gateway概要

API Gateway

開発者が簡単に、セキュアにAPIの構築、公開、メンテナンス、モニターを行うことができるフルマネージドサービス。

API Gatwayによる3種類のタイプのAPI

  • Edge-optimized
    • CloudFrontを使用して、TLS接続のオーバーヘッドを削減(往復時間を短縮)
    • グローバルに分散されたセットのクライアント向けのデザイン
  • Regional
    • 一般的なユースケースで推奨される
    • 同じリージョンに向けて構築されたAPI
  • Private
    • VPC内からのみアクセス可能(ネットワーク接続もVPCのみ)
    • インターナルもしくはプライベートなマイクロサービス向けのデザイン

サポートするプロトコル

  • HTTP (REST)
    • Request/response
    • HTTP methods (GET, POST etc.)
    • 短時間の通信
    • ステートレス
  • WebSocket
    • サーバレスWebSocket
    • 双方向通信チャネル
    • 長時間の通信
    • ステートフル

API GWを管理する方法

  • マネジメントコンソール
  • AWS CLI
  • AWS SAM
  • CloudFormation
  • Swagger/OpenAPI
  • AWS CDK

バックエンドとのインテグレーション

Integration Type

  • Lambda function
    • 直接もしくはプロキシを介した接続
  • HTTP
    • AWS内外のHTTP(S) エンドポイント
  • Mock
    • バックエンドなしで空のリクエスト
  • AWS Service
    • 100種類以上のAWSサービスエンドポイント (DyanamoDB, Kinesis etc. )
  • VPC Link
    • VPC linkとの接続
    • VPC内部のリソースにNetwork Load Balancerを介して接続

プロキシを介したLambda関数との統合

  • リクエスト
    • メタデータでラップされ、バックエンドに渡される
  • レスポンス
    • そのままクライアントに渡される

直接のLambda関数との統合

  • リクエストおよびレスポンス
    • Velocity Template Language (VTL) を用いて、API Gatwayによる変更が可能

Integration flow

  1. Method request
    • モデリング
    • バリデーション
    • トランスフォーメーション
  2. Integration request
  3. Method response
    • トランスフォーメーション
    • カスタムエラー
  4. Integration response

API Gatewayの特徴

認証

  • open
    • 認証なし or 認証
  • IAM permission
    • IAM ポリシとクレデンシャルによるアクセス許可
  • Cognito authorizers
    • Cognitoユーザープール および OAuthを使用しての認証
    • Cognitoはマネージドな認証のためのユーザディレクトリ
  • Lambda authorizers
    • Lambdaを用いてbearer token(OAuth or SMAL) or requestパラメタを検証することによるアクセス許可

キャッシュ

  • 素早いレスポンスとバックエンドへのロードを最小化
  • レスポンス最適化のためのレバレッジキャッシュキー
    • パス、ヘッダ、クエリ
  • ステージもしくはメソッドごとに設定可能

スロットリング

  • リージョンワイドで、10k request/sec
  • ソフトリミットなので、緩和申請可能
  • 使用プランでAPIレベルまたは使用レベルの調整を構成

VPC Link(Private Integration)

  • VPC外のリソースがNLBを介してVPC内のリソースと接続

ステージ

エンドポイントは複数のステージをサポート

  • [Prod stage] http://my.api-endpoint12345.com/prod/
  • [Beta stage] http://my.api-endpoint12345.com/beta/
  • [Dev stage] http://my.api-endpoint12345.com/dev/

ステージ変数を使用して、Lambdaエイリアスを動的に選択可能

カナリアリリース

一定期間内の N%のトラフィックをCanary stageへ送ることが可能

WAF統合

  • SQLインジェクションやクロスサイトスクリプティングなどの一般的な攻撃からAPI Gatewayを保護
  • 特定のIPアドレスレンジ or CIDRブロックからのリクエストをブロック
  • 特定の国やリージョンからのリクエストをブロック
  • HTTPヘッダ、メソッド、クエリ、URI、リクエストボディを正規表現でマッチ可能
  • 特定のユーザエージェント、ボット、コンテンツスクレイパーからの攻撃から保護

モニタリングとメトリクス

  • CloudWatch
    • API-, stage-, メソッドレベルメトリクス
  • X-ray
    • エンドツーエンドのリクエストのトレースと解析
  • CloudTrail
    • ユーザーロールもしくはAWSサービスからのAPI Gatewayの呼び出しの記録
  • Config
    • 評価、監査。コンフィグのアップデート

ロギング

CloudWatch Logsによるログ

  • 実行ログ
  • デバッグとトラブルシュート
    • Error/infoレベル
  • アクセスログ
    • フォーマットをカスタマイズ可能
    • CLF(common log format), JSON, XML, csvに対応
  • カスタム分析とレポートをエクスポート
  • Kinesis firehouseにも出力可能

開発者ポータル

  • APIセルフディスカバリー
  • API登録とキー生成
  • APIモニタリングと用法
  • APIドキュメンテーション
  • APIテスト
  • SDK生成

【参考】サーバーレス開発者ポータルを使用して、API Gateway API を分類する

クライアント証明書

  • クライアントサイドの証明書を生成
  • バックエンドが公開鍵を使用してAPI Gatewayからのリクエストを検証可能
  • 365日有効

カスタムドメイン

例) https://*.mydomain.com/api-one

  • ACMを利用した証明書が利用をサポート
  • ワイルドカードの利用をサポート
  • ベースパスマッピングによる複数ドメインのサポート

Swagger/OpenAPI3 インポートとエクスポート

以下が可能。

  • API Gateway <=> Swagger
  • API Gateway <=> OpenAPI3
  • Swagger <=> OpenAPI3

おわりに

何気なく使っていたAPI Gatewayについて再入門できる良セッションでした。また、登壇者のEric Johnsonの話し方も上手で、非常に聴きやすかったです。

以上、何かのお役に立てれば幸いです。