Amazon API Gateway概要

# Amazon API Gateway 概要

Amazon API Gatewayの概要をまとめる。

## API Gateway

### APIとは

* Application Programming Interfaceの略称。
* プログラムやソフトウェア同士がやり取りするための取り決め・仕様、機能の提供方法。

### API 提供時の共通課題

1. インフラ管理：可用性とスケーラビリティの保証

2. API管理：設定やデプロイの制御

3. 認証・認可：アクセス制御

   ...

### API Gatewayとは

* API Gatewayは、上記のWeb API提供時の共通課題を解決するためのフルマネージド型AWSサービス。

  * オートスケール
  * 仮想サーバー管理不要
  * 使用料に応じた課金

  ![API_Gateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/5bb878d7-0c00-24f2-a6eb-6216460e3cdd.png)

### API Gatewayが扱うAPI

以下の２種類のAPIを扱うことができる。

* REST
  * REST= Representational state transfer
  * 1HTTPメッセージで１操作情報を扱う(基本)
  * 扱う情報をURIで表現する「リソース」として定義。それらをHTTPメソッド(POST,PUT,GET,...)表現で操作
* Websocket
  * HTTP上での、クライアント-サーバー間双方向通信仕様
  * １コネクションで継続的なデータ送受信を行う(ステートフル)

### REST APIエンドポイントタイプ

REST APIの場合、クライアントから見たアクセス先のエンドポイントの性質を以下の３種類のタイプから選択。

* エッジ最適化
  * 一旦エッジロケーション(CloudFrontディストリビューション)にルーティングする。
* リージョン
  * リージョンに直接ルーティング
* プライベート
  * VPC内からのみアクセス可能

## API作成の流れ

1. API設計
   * 要求および仕様を確認
2. プロトコル種別とエンドポイントタイプを選択
   * REST をプロトコルとして選択
   * リージョン、エッジ最適化、プライベートからエンドポイントを選択(RESTの場合)
3. リソース&メソッド設定
   * リソースとメソッド
     * 「/」を最上位としたツリー構造にて「リソース」を定義。各リソースに受け付けるHTTPメソッドを指定 (パスパラメータの利⽤も可能)。
     * 例
       * エンドポイント
         ```http
         https://<api-id>.execute-api.<region-id>.amazonaws.com/<stage-name>/…
         ```
       * API(REST) 例：PetStore
         * リソース:`/`
           * リソース:`/pets`
             * GET
             * リソース:`/{petId}`
               * GET,PUT,DELETE,...
   * 認証の設定や、受け付けるクエリパラメータ、必須とするHTTPヘッダなど「リクエ ストの受付」に関する設定。
   * ルーティング先バックエンドの指定、リクエストの変換。
   * レスポンス内容の変換やステータスコードのマッピング。
   * リクエストに対する最終的なAPIGatewayとしてのレスポンス。
4. デプロイとステージの設定
   * ステージ＝デプロイ先環境。prod,staging,dev
   * ステージ名は、エンドポイントURLの一部として利用。
     ```http
     https://<api-id>.execute-api.<region-id>.amazonaws.com/prod/…
     ```
     ```http
     https://<api-id>.execute-api.<region-id>.amazonaws.com/staging/…
     ```

**その他**
* 既存APIのクローンやSwagger設定(Yaml)をインポートによる作成が可能。

  

## API Gatewayのユースケース

1. インターネットからアクセス可能なパブリックなWeb APIの提供。
2. 企業グループ内でのプライベートなWeb APIの提供。
3. Dynamo DBなどAWSサービスを独⾃のWeb API化する⼿段として利⽤。
4. サーバーレスアーキテクチャの実現する⼿段として利⽤。

### よく見る構成

1. **REST API**
   ![API_Gateway_RESTAPI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/13c1ca0d-53ef-767d-7d9c-9a732dbde9b5.png)

2. **SPA**
   ![API_Gateway_SPA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/66c07866-eea6-7624-f78a-14b1916f9fb5.png)

## 認証・認可
アクセス制御パターン
### Open
* APIを保護する必要がない場合。 誰もがAPIへのアクセスを許可されている状態。

### **IAMアクセス権限**
* AM UserやRoleで発行されるアクセスキーを利用してアクセスを検証。
* 該当API Gatewayの呼び出し権限をIAM UserやRoleにアタッチされている場合かつ, アクセスキーが正当なものである場合は呼び出し可。

### Cognito Authorizer
* Cognito User Poolと接続し, 発行されたOAuthトークンの検証をAPI Gatewayで実施し、API呼び出しを制御。

### Lambda Authorizer
* Lambda関数にトークンなどの認証情報を渡してAPI呼び出しを制御。

## 参考情報

* [[[AWS Black Belt Online Seminar]Amazon API Gateway](https://d1.awsstatic.com/webinars/jp/pdf/services/20190514_AWS-Blackbelt_APIGateway_rev.pdf)
* [Amazon API Gateway は何をしてるのか](https://dev.classmethod.jp/articles/what-does-amazon-api-gateway-do/)

* [AWS Black Belt Tech シリーズ 2015 - Amazon API Gateway](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-2015-amazon-api-gateway)