AWS DVA対策メモ(API GateWay)

# AWS API GateWay
AWS DVA対策のために、ChatGTPで聞いたことをメモリます。

## AWS API Gateway REST API, WebSocket API, HTTP API 比較

AWS API Gatewayは、アプリケーションやサービス間の通信を管理するための機能を提供します。ここでは、**REST API**，**WebSocket API**，**HTTP API**の特徴を比較表でまとめます。

---

### AWS API Gatewayの比較表

| 特徴                         | REST API                                      | WebSocket API                              | HTTP API                                    |
|------------------------------|----------------------------------------------|-------------------------------------------|--------------------------------------------|
| **目的**                     | リクエスト/レスポンスモデルを使用したRESTful通信 | 双方向通信、リアルタイムなデータ交換に最適  | シンプルで低レイテンシなHTTPベースのAPI     |
| **ユースケース**             | - RESTful API設計<br>- サーバレスアプリケーション | - チャットアプリ<br>- リアルタイム通知     | - CRUDアプリケーション<br>- シンプルなHTTP通信 |
| **プロトコル**               | HTTP 1.1/HTTPS                                | WebSocket                                  | HTTP 1.1/HTTPS                              |
| **認証**                     | - AWS IAM<br>- APIキー<br>- Cognitoユーザープール | - AWS IAM<br>- Cognitoユーザープール       | - AWS IAM<br>- Cognitoユーザープール         |
| **バックエンド経由**         | - Lambda関数<br>- HTTP経由<br>- AWSサービス経由 | - Lambda関数                               | - Lambda関数<br>- HTTP経由<br>- AWSサービス経由 |
| **ステート管理**             | ステートレス                                  | ステートフル                                | ステートレス                                 |
| **スロットリングと割り当て** | 対応                                          | 非対応                                    | 対応                                        |
| **キャッシュ**               | レスポンスのキャッシュをサポート              | 非対応                                    | 非対応                                      |
| **料金**                     | 高め                                          | 中程度                                    | REST APIより安価                            |
| **開発の柔軟性**             | 高機能（リクエスト/レスポンスの変換など）      | 双方向通信に特化                           | シンプルで高速                               |
| **リアルタイム性**           | 非対応                                        | 対応                                      | 非対応                                     |
| **対応するAWSリージョン**    | グローバル                                    | グローバル                                | グローバル                                  |

---

### 選び方のポイント

#### 1. REST API
- 複雑なリクエスト/レスポンスモデルや詳細なカスタマイズが必要な場合に適しています。
- 料金は高めですが、高機能を提供します。

#### 2. WebSocket API
- チャットやリアルタイム更新など、双方向通信が必要なアプリケーションに最適です。
- 通信状態を維持するため、クライアントとサーバー間の接続を続けます。

#### 3. HTTP API
- シンプルなAPI設計に適し、低レイテンシでコストパフォーマンスが良いです。
- REST APIの代替として使用可能ですが、一部機能は限定的です（例: キャッシュ非対応）。

---

# REST APIのエンドポイントタイプ
| エンドポイントタイプ          | 特徴                                                                                       | 主なユースケース                                |
|-------------------------------|-------------------------------------------------------------------------------------------|-----------------------------------------------|
| **エッジ最適化 (Edge-Optimized)** | CloudFrontを使用してグローバルに最適化されたエンドポイントを提供。<br>低レイテンシ通信が可能。 | グローバルなユーザー向けのAPI                   |
| **リージョン (Regional)**       | 特定のAWSリージョン内で直接アクセス可能。                                                 | 同一リージョン内のアプリケーションやサービス間通信 |
| **プライベート (Private)**      | VPCリンクを使用して、VPC内のリソースにアクセス可能。                                       | セキュアな社内システムやバックエンドの統合        |

# REST APIの定義項目
| 項目                      | 説明                                                                                     |
|---------------------------|-----------------------------------------------------------------------------------------|
| **リソース**              | APIで扱うエンドポイント（例: `/users`や`/orders`）。                                     |
| **メソッド**              | 各リソースに対して実行可能なHTTPメソッド（例: GET, POST, PUT, DELETE）。                 |
| **メソッドリクエスト**    | クライアントからの入力を定義し、認証やバリデーションを設定。                             |
| **統合リクエスト**        | バックエンドと連携するための設定（例: Lambda統合、HTTP統合）。                           |
| **統合レスポンス**        | バックエンドからのレスポンスを加工し、クライアントに返すレスポンスを定義。               |
| **メソッドレスポンス**    | クライアントに返されるレスポンス（ステータスコードやレスポンスヘッダーなど）。           |
| **モデル**                | リクエストやレスポンスのペイロードを定義するスキーマ（JSON形式）。                       |
| **ステージ**              | APIのデプロイメント環境（例: `dev`（開発環境）、`prod`（本番環境））。                  |
| **オーソライザー**        | APIの認証を設定するための機能（例: Lambdaオーソライザー、Cognitoユーザープール）。       |

# WebSoket APIのエンドポイント
| エンドポイントタイプ          | 説明                                                                                   | 主なユースケース                                    |
|-------------------------------|---------------------------------------------------------------------------------------|---------------------------------------------------|
| **リージョン (Regional)**       | 特定のAWSリージョン内でWebSocket接続を提供。                                           | 同一リージョン内での低レイテンシ通信が求められる場合 |
| **プライベート (Private)**      | VPCリンクを使用して、VPC内のリソースにアクセス可能なセキュアなWebSocket接続を提供。       | 内部システムやセキュアなネットワーク内での通信      |

# WebSoket APIの設定項目
| 項目                  | 説明                                                                                       |
|-----------------------|-------------------------------------------------------------------------------------------|
| **ルート選択式**      | クライアントリクエストをどのルートにルーティングするかを決定するための式（例: `$request.body.action`）。 |
| **ルート**            | クライアントのリクエストに基づいて実行されるロジックを定義（例: `$connect`, `$disconnect`, `$default`）。 |
| **統合**              | 各ルートとバックエンド（例: Lambda関数、HTTPエンドポイントなど）を統合する設定。               |
| **ステージ**          | WebSocket APIのデプロイメント環境（例: `dev`（開発環境）、`prod`（本番環境））。              |

# HTTP API設定項目
| 項目           | 説明                                                                                       |
|----------------|-------------------------------------------------------------------------------------------|
| **ルート**     | クライアントリクエストを特定のバックエンドリソースにルーティングするための設定（例: `/users`, `/orders`）。 |
| **統合**       | 各ルートとバックエンド（例: Lambda関数、HTTPエンドポイント、AWSサービス）を統合する設定。       |
| **ステージ**   | HTTP APIのデプロイメント環境（例: `dev`（開発環境）、`prod`（本番環境））。                  |

# 認証方法
| 認証方法               | 説明                                                                                       | 主なユースケース                                  | 利用可能なAPI種類                       |
|------------------------|-------------------------------------------------------------------------------------------|-----------------------------------------------|---------------------------------------|
| **IAMアクセス権限**    | AWS IAMポリシーを使用して、リクエストを認証および許可します。                               | APIをAWSサービスやIAMユーザーで保護する場合       | REST API, WebSocket API, HTTP API     |
| **Lambdaオーソライザー**| カスタムロジックをLambda関数で実装し、リクエストを認証および許可します。                     | 特定の認証スキームやカスタムヘッダー認証を使用する場合 | REST API, WebSocket API, HTTP API     |
| **Cognitoオーソライザー**| Amazon Cognitoユーザープールを使用して、OAuth2.0やOpenID Connectを利用した認証を提供します。  | アプリケーションユーザー向けの認証を簡単に設定する場合 | REST API, WebSocket API, HTTP API     |
| **JWTオーソライザー**  | JSON Web Token（JWT）を解析し、認証情報を検証します。                                        | 外部IDプロバイダーやカスタムトークン認証を使用する場合 | HTTP API                              |
| **相互TLS認証**        | クライアント証明書を使用してリクエストの認証を行います。                                      | 高度にセキュアな通信が求められる場合              | REST API, HTTP API                    |
| **スロットリング**      | 1秒あたりのリクエスト数やリクエストの上限を設定して、過負荷を防ぎます。                     | APIの可用性とパフォーマンスを維持する場合         | REST API, HTTP API                    |

# その他API機能
| 機能                 | 説明                                                                   | 対応API                          |
|----------------------|----------------------------------------------------------------------|---------------------------------|
| **APIキャッシュ**     | レスポンスをキャッシュしてバックエンドへのリクエスト回数を削減。              | REST API のみ                   |
| **カナリアリリース** | 新しいバージョンを段階的にリリースしてテスト可能。                        | REST API, HTTP API              |
| **WAF連携**          | 悪意のあるリクエストをフィルタリングしてAPIを保護。                      | REST API, HTTP API              |
| **監視連携**         | CloudWatchやX-Rayと連携してパフォーマンスと使用状況を監視。              | REST API, WebSocket API, HTTP API |