API GatewayのREST APIエンドポイントタイプを整理してみた

# 背景・目的
API GatewayのREST APIには「エッジ最適化エンドポイントがある」と最近知りました。これまでリージョンサービスだと思い込んでいた認識をあらためました。そこで、エンドポイントタイプについて整理し、それぞれの特徴やメリットを理解した内容をまとめます。


# まとめ
下記に特徴を整理します。

|特徴|説明|
|:--|:--|
|APIエンドポイントとは|特定のリージョンにデプロイされるAPI GatewayのAPIホスト名を指す<BR><BR>ホスト名の形式は` {api-id}.execute-api.{region}.amazonaws.com`<BR><BR>下記のエンドポイントタイプがサポートされる<BR>・エッジ最適化 API エンドポイント<BR>・プライベート API エンドポイント<BR>・リージョン API エンドポイント|
|エッジ最適化 API エンドポイント|・リクエストを最寄りもCloudFront POPにルーティングする<BR>・クライアントが地理的に分散されている場合に役立つ<BR>・デフォルトのエンドポイントタイプ<BR>・カスタムドメイン名はすべてのリージョンに適用される|
|リージョン API エンドポイント|同じリージョン内のクライアントを対象としている<BR>例えば下記のような用途と考えられる。<BR>・同一リージョンのバックエンドサービス間通信<BR><BR>カスタムドメイン名はAPIがデプロイされているリージョン固有になる<BR>しかし、複数のリージョンでリージョン別 API をデプロイする場合、すべてのリージョンで同じカスタムドメイン名を使用できる<BR>カスタムドメインを Amazon Route 53 と組み合わせて使用すると、レイテンシーベースのルーティングなどのタスクを実行できる|
|プライベート API エンドポイント|VPCからしかアクセスできないAPIエンドポイント<BR>すべてのヘッダー名をそのまま渡す|


# 概要

## API エンドポイント
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-basic-concept.html#apigateway-definition-api-endpoints


> 特定のリージョンにデプロイされる API Gateway の API のホスト名。ホスト名の形式は {api-id}.execute-api.{region}.amazonaws.comです。次のタイプの API エンドポイントがサポートされています。
>- エッジ最適化 API エンドポイント
>- プライベート API エンドポイント
>- リージョン API エンドポイント

- 特定のリージョンにデプロイされるAPI GatewayのAPIホスト名を指す
- ホスト名の形式は` {api-id}.execute-api.{region}.amazonaws.com`
- 下記のエンドポイントタイプがサポートされる
    - エッジ最適化 API エンドポイント
    - プライベート API エンドポイント
    - リージョン API エンドポイント

## API Gateway での REST API の API エンドポイントタイプ
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-endpoint-types.html

> API エンドポイントタイプは、API のホスト名を参照します。API エンドポイントタイプは、API トラフィックの大部分の発信元となっている場所に応じて、エッジ最適化、リージョン別、またはプライベートとすることができます。

- APIトラフィックの大部分の発信元となっている場所に応じて、下記のタイプに大別される
    - エッジ最適化
    - プライベート
    - リージョン別

### エッジ最適化 API エンドポイント
> エッジ最適化 API エンドポイントは通常、リクエストを最寄りの CloudFront POP (Point of Presence) にルーティングします。これは、クライアントが地理的に分散されている場合に役立ちます。これは、API Gateway REST API のデフォルトのエンドポイントタイプです。

- リクエストを最寄りもCloudFront POPにルーティングする
    - つまり、CloudFrontとリージョン間の通信をAWSのバックボーン回線を利用して通信できるのでレイテンシーが低いと思われる
- クライアントが地理的に分散されている場合に役立つ
- デフォルトのエンドポイントタイプ

> エッジ最適化された API では、HTTP ヘッダーの名前の最初の文字は大文字になります (例: Cookie)。

- エッジ最適化では、HTTPヘッダーの名前の最初の文字は大文字

> CloudFront は、リクエストをオリジンに転送する前に、Cookie 名の自然な順序で HTTP Cookie を並べ替えます。 

> エッジ最適化された API に使用するカスタムドメイン名はすべてのリージョンに適用されます。

- カスタムドメイン名はすべてのリージョンに適用される

### リージョン API エンドポイント
> リージョン API エンドポイントは、同じリージョン内のクライアントを対象としています。EC2 インスタンスで実行されているクライアントが同じリージョン内の API を呼び出すか、API が要求の高い少数のクライアントへのサービスを目的としている場合、リージョン API は接続のオーバーヘッドを減らします。

- 同じリージョン内のクライアントを対象としている
    - つまり、下記の場合と思われる
        - バックエンドサービス間通信
            - 同一リージョンのLambdaから呼び出す
- 下記の場合、接続のオーバヘッドを減らす
    - EC2インスタンスで実行されているクライアントが同一リージョン内のAPIを呼び出す
    - API要求の高い少数クライアントのサービスを目的とする

> リージョン API の場合、ユーザーが使用するカスタムドメイン名は API がデプロイされているリージョンに固有です。複数のリージョンでリージョン別 API をデプロイする場合、すべてのリージョンで同じカスタムドメイン名を使用できます。カスタムドメインを Amazon Route 53 と組み合わせて使用すると、レイテンシーベースのルーティングなどのタスクを実行できます。

- カスタムドメイン名はAPIがデプロイされているリージョン固有になる
- しかし、複数のリージョンでリージョン別 API をデプロイする場合、すべてのリージョンで同じカスタムドメイン名を使用できる
- カスタムドメインを Amazon Route 53 と組み合わせて使用すると、レイテンシーベースのルーティングなどのタスクを実行できる

> リージョン別 API エンドポイントは、すべてのヘッダー名をそのまま渡します。
- すべてのヘッダー名をそのまま渡す


### プライベート API エンドポイント
> プライベート API エンドポイントは、Amazon Virtual Private Cloud (VPC) からしかアクセスできない API エンドポイントです。インターフェイス VPC エンドポイントは、VPC 内に作成するエンドポイントネットワークインターフェイス (ENI) です。詳細については、「API Gateway のプライベート REST API」を参照してください。

- VPCからしかアクセスできないAPIエンドポイント

> Private API エンドポイントは、すべてのヘッダー名をそのまま渡します。
- すべてのヘッダー名をそのまま渡す

# 考察
今回、API GatewayのREST APIについて3つのエンドポイントタイプ（エッジ最適化、リージョン、プライベート）を整理しました。それぞれに適したユースケースがあることを理解し、特にデフォルトで提供されるエッジ最適化エンドポイントには、低レイテンシーなどのメリットがあると気付きました。

また、これまでAPI Gatewayを完全にリージョンサービスだと思い込んでいましたが、エッジ最適化エンドポイントを利用すれば、CloudFrontを介してグローバルなユーザーに最適化された通信を提供できそうな点が新たな発見でした。


# 参考

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-endpoint-types.html

https://qiita.com/zumax/items/b11bb6653f3f46adb674