本記事の内容
本記事では、初めてAPI Gatewayを扱う人やAWS認定資格取得を目指す方向けに、API Gatewayの基礎知識を解説します。
- API Gatewayの仕組み・特徴
- API Gatwayと連携可能なAWSサービス
- API Gatewayの設定項目
API Gatewayの概要
API Gatewayは、APIを管理・公開するためのAWSのフルマネージドサービスです。
これにより、リクエストの受信、ルーティング、認証・制御などを行い、バックエンドサービスとの統合を簡素化します。また、APIのトラフィック管理やモニタリング機能を提供し、スケーラブルでセキュアなAPIを構築できます。
API Gatewayの仕組み
クライアントからのリクエストが送信されると、ユーザーの認証情報を確認し、アクセス権限をチェックします。
これによって不正アクセスを防ぎ、適切なユーザーにのみAPIへのアクセスを許可します。一般的にはAWS IAMやCognitoを使用して認証と認可が実施されます。
受信したリクエストを設定されたルールに基づいて適切なバックエンドサービスにルーティングします。
このルーティングはリクエストのメソッドやパスによって決定され、複数のバックエンドサービスとの統合を実現します。これにより、APIの可用性と柔軟性が向上します。
バックエンドサービスがリクエストを処理し、レスポンスを生成した後、API Gatewayはそのレスポンスをクライアントに返します。
この際、必要に応じてレスポンスの形式を変換したり、データを加工したりすることができます。これにより、クライアントに適したデータ形式で情報を提供します。
リクエストとレスポンスの情報を収集し、モニタリングやロギングを行います。
この機能により、APIのパフォーマンスや使用状況を分析し、問題を特定するのが容易になります。
また、CloudWatchとの統合により、リアルタイムでメトリクスを監視することも可能です。
API Gatewayの特徴
以降では、API Gatewayの以下特徴について解説していきます。
- 多様なAPIタイプをサポート
- セキュリティ機能の簡易実装
- 様々なトラフィック制御が可能
- レスポンスのキャッシング機能による性能最適化
特徴①:多様なAPIタイプをサポート
API Gatewayでは下記4つのタイプがサポートされています。
- HTTP API
- WebSocket API
- REST API
- REST API プライベート
それぞれの特徴を解説していきます。
①-1 HTTP API
HTTP APIは、軽量で低コストのAPIを提供するためのオプションです。
RESTful APIに比べてシンプルな設計が特徴で、特にLambda関数やHTTPバックエンドサービスへのリクエストを迅速に処理します。主にマイクロサービスアーキテクチャやマシン間通信に適しており、高速なレスポンスと低レイテンシを実現します。
<HTTP API>
【メリット】
- 低レイテンシで高速なレスポンスを実現
- 利用料金がREST APIよりも安価
【デメリット】
- REST APIと比べて機能が制限されている(例:APIキー、カスタムドメインの設定)
①-2 WebSocket API
WebSocket APIは、クライアントとサーバー間で双方向のリアルタイム通信を可能にするAPIです。
これにより、チャットアプリやオンラインゲーム、リアルタイムの通知システムなど、イベントドリブンなアプリケーションに最適です。WebSocket接続は持続的で、低オーバーヘッドでメッセージを送受信できるため、インタラクティブなユーザー体験を提供します。
<WebSocket API>
【メリット】
- クライアントとサーバー間でリアルタイムのデータ交換が可能。
- 持続的な接続により、低オーバーヘッドでメッセージを送受信。
【デメリット】
- 状態管理やエラーハンドリングが複雑になることがある。
- 持続的な接続を維持するため、リソースの消費が増加する可能性がある。
①-3 REST API
REST APIは、HTTPメソッド(GET、POST、PUT、DELETEなど)を使用してリソースにアクセスするための広く普及したAPIスタイルです。
リソース指向の設計に基づき、API GatewayはURLをエンドポイントとして提供し、データの取得や操作を容易にします。多くの外部サービスやクライアントアプリケーションとの互換性が高く、一般的なWebアプリケーションで広く利用されています。
<REST API>
【メリット】
- 多くの外部サービスやクライアントと互換性が高い。
- 認証やキャッシング、APIバージョニングなどの機能が豊富。
【デメリット】
- HTTPリクエストのオーバーヘッドがあり、レスポンスが遅くなることがある。
- HTTP APIよりも料金が高い場合がある。
【RESTとは?】
「Representational State Transfer」の略で、Webサービスの設計原則の一つです。
RESTは、リソース(データや機能)を一意のURI(Uniform Resource Identifier)で識別し、HTTPメソッド(GET、POST、PUT、DELETEなど)を使用してリソースの状態を操作するアーキテクチャスタイルです。
- ステートレスな通信
- クライアントとサーバーの分離
- リソースの表現形式(JOSNやXML等)
①-4 REST API プライベート
REST API プライベートは、VPC内のリソースにアクセスするためのAPIです。
インターネットからのアクセスを制限し、セキュアな内部通信が可能になります。企業の内部システムやデータベースに対して、AWSのセキュリティ機能を活用しながら、安全にアクセスする手段を提供します。
<REST API プライベート>
【メリット】
- インターネットから隔離されているため、外部からの攻撃に対して安全。
- AWSのVPC内のリソースと直接統合できる。
【デメリット】
- 外部からのアクセスが制限されているため、特定のユースケースにしか利用できない。
- VPC設定やセキュリティグループの管理が必要になる。
特徴②:セキュリティ機能の簡易実装
APIキーやJWTトークンによる認証に加え、カスタムオーソライザーを利用することで柔軟な認可制御を実装できます。例えばIPアドレスによる制限やヘッダー値による認可など、ビジネス要件に応じた細かな制御が可能です。
また、SSL/TLS暗号化の強制やセキュリティポリシーの一元管理により、運用負荷を大きく軽減できます。
【①APIキーとは?】
APIキーは、APIへのアクセスを制御するための一意の識別子で、クライアントがAPIを呼び出す際に提供する必要があります。
これにより、特定のユーザーやアプリケーションのリクエストを認証し、トラフィックの制限や使用状況のモニタリングが可能になります。APIキーはセキュリティを強化する手段ですが、適切な管理が必要です。
【②JWTトークンとは?】
JWT(JSON Web Token)は、ユーザーの認証情報やその他のデータを安全に伝達するためのコンパクトな形式のトークンです。
JWTは、ヘッダー、ペイロード、署名の3つの部分から構成され、Base64エンコードされて送信されます。
これにより、サーバーはトークンを検証してユーザーの身元を確認し、アクセス権を制御できます。
【③オーソライザーとは?】
オーソライザーは、API Gatewayにおいてクライアントからのリクエストの認証と認可を行う仕組みです。
API Gatewayでは下記2つの方法が選択可能であり、これによって開発者は要件に応じて最適な認証メカニズムを選択できます。
- Cognito
- JWTトークンによってユーザーの認証情報を確認する。
- Lambda
- 独自の認証ロジックを実装する。
特徴③:様々なトラフィック制御が可能
API Gatewayは、リクエストのスロットリングやバースト制限を設定することで、トラフィックを効果的に制御できます。
これにより、特定のユーザーやアプリケーションに対して、一定のリクエスト数を超えないように制限し、バックエンドサービスの負荷を軽減します。またトラフィックの制御は、サービスの可用性を向上させ、悪意のある攻撃から保護するためにも役立ちます。
【①スロットリングとは?】
特定の期間内に許可されるリクエストの数を制限する機能です。
たとえば、1分あたりに受け付けるリクエストの上限を設定することで、過剰なトラフィックからバックエンドを保護します。これにより、リソースの過負荷を防ぎ、安定したサービスを提供できます。
【②バースト制限とは?】
通常のリクエスト数の上限を超えて、短期間に多くのリクエストを受け入れることを許可する機能です。
たとえば、一定の時間内に一時的にリクエストが集中する場合に、その集中を受け入れられるようにするために設定します。バースト制限により突発的なトラフィックの増加にも柔軟に対応できますが、一定の制限を設けることで全体の安定性を確保します。
特徴④:レスポンスのキャッシング機能による性能最適化
API Gatewayは、頻繁にリクエストされるレスポンスをキャッシュする機能を提供します。
開発者が各APIメソッドに対してキャッシュのTTL(Time to Live)やキャッシュキーを指定する設定を行うことで、同じデータに対するリクエストがあった場合にバックエンドに再度アクセスする必要がなくなり、応答速度が向上し、システム全体のパフォーマンスが最適化されます。
API Gatewayと連携可能なAWSサービス
API Gatewayは様々なAWSサービスと連携することができます。
以降では、代表的なAWSサービスに絞ってカテゴリ別に解説していきます。
カテゴリ①:コンピューティング
- Lambda
- API Gatewayからのリクエストに基づいて自動的に関数を実行します。
- 開発者はサーバーの管理を気にせずビジネスロジックに集中できるため、スケーラブルなアプリケーションを迅速に構築できます。
- EC2
- API Gatewayを介して、ホストされるアプリケーションやサービスにアクセスできます。
- EC2を使用することで、フルコントロールのもとでカスタムアプリケーションを展開し、必要に応じてスケーリングや設定を行うことができます。
カテゴリ②:データベース・ストレージ
- DynamoDB
- フルマネージドのNoSQLデータベースサービスで、スケーラブルで低レイテンシのデータアクセスを提供します。
- API Gatewayと連携することで、キー・バリュー形式のデータストレージとして、リアルタイムなアプリケーションに対応できます。
- S3
- オブジェクトストレージサービスで、静的ファイル(画像、動画、ドキュメントなど)を格納・提供するのに適しています。
- API Gatewayを介してS3にアップロードやダウンロードのリクエストを処理でき、データの保存と配信をシンプルに行うことができます。
カテゴリ③:メッセージングとワークフロー
- SQS
- フルマネージドのメッセージキューサービスで、メッセージを安全に送受信し、非同期処理を実現します。
- API Gatewayと連携することで、クライアントからのリクエストをSQSキューに送信しメッセージを処理できます。
- SNS
- プッシュ型のメッセージングサービスで、さまざまなプロトコルを通じてメッセージを配信します。
- API Gatewayを使用してSNSトピックにメッセージを公開し、通知やアラートを簡単に送信できます。
- Step Functions
- 複数のAWSサービスを統合したサーバーレスワークフローの管理サービス。
- API Gatewayと連携することで、状態遷移を持つ複雑なアプリケーションを構築し、バックエンド処理を自動化できます。
カテゴリ④:セキュリティ管理とアクセス制限
- Cognito
- ユーザー認証と認可を提供するサービスで、ユーザーのサインアップ、サインインを管理します。
- API Gatewayと連携することで、Cognitoから発行されたJWTトークンを使用して、APIリクエストの認証とアクセス制御を行うことができます。
- Lambda
- カスタムオーソライザーとして利用され、API Gatewayへのリクエストに対して独自の認証ロジックを実装できます。
- Lambda関数を使用して、トークンやクレデンシャルの検証を行い、ユーザーの認証と認可を柔軟に管理することができます。
カテゴリ⑤:モニタリング
- CloudWatch
- WSリソースやアプリケーションのメトリクスとログを収集・監視するサービスで、API Gatewayのパフォーマンスをリアルタイムで監視できます。
- リクエスト数、レスポンスタイム、エラーレートなどのメトリクスをダッシュボードで可視化し、アラームを設定することで異常を迅速に検知できます。
- CloudTrail
- AWSアカウント内でのAPIコールの履歴を記録するサービスで、API Gatewayを介して行われたすべてのリクエストを追跡できます。
- これにより、誰がどのAPIをいつ実行したかを監査し、セキュリティの強化やコンプライアンスの確認に役立てることができます。
API Gatewayの設定項目
API Gatewayの設定項目は多岐に渡るので、ここではREST APIにおける代表的な設定項目を解説します。
①:リソース
API Gatewayにおける「リソース」は、APIのエンドポイントやデータモデルを表す概念です。
リソースはURLパスとして構成され、特定のデータや機能にアクセスするためのインターフェースを提供します。
たとえば、ユーザー情報を取得するための /users
や、特定のユーザーを取得するための /users/{userId}
などがリソースとして定義されます。
<AWSの設定画面>
①-1 プロキシのリソース
プロキシリソースは、特定のパスに対するすべてのリクエストを受け取るための仕組みです。
これを作るには、パスにプラス記号(+)を追加します。たとえば、/{child+}
という形で、/parent
以下のすべてのリクエストを処理できるようになります。また、プロキシリソースとプロキシ統合を組み合わせることで、APIの動作を柔軟にカスタマイズできます。
①-2 リソースパス
APIのエンドポイントを定義するためのURLの一部です。リソースパスは、特定のリソースや機能にアクセスするための道筋を示し、APIの利用者がどのURLを介してデータや操作をリクエストできるかを決定します。
たとえば、ユーザー情報を取得するためのリソースパスが /users
であれば、クライアントはこのURLを使ってユーザー情報にアクセスできます。また、特定のユーザーの詳細を取得するために /users/{userId}
のように、動的な部分を含めることも可能です。このように、リソースパスはAPIの構造を明確にし、クライアントがどのリクエストをどこに送るべきかを理解しやすくします。
①-3 リソース名
APIの各リソースを識別するための名前です。このリソース名は、リソースパスと連携して、APIの構造を明確にする役割を果たします。
たとえばユーザー情報を管理するAPIの場合、リソース名を「Users」と設定することで、そのリソースがユーザーに関連するものであることがわかります。リソース名は、APIドキュメントやユーザーインターフェースに表示され、開発者や利用者にとって理解しやすい形でAPIを利用できるようにします。
①-4 CORS
CORS(Cross-origin resource sharing)は、ブラウザが異なるオリジン(ドメイン)からのリクエストを制限するためのセキュリティ機能です。
API GatewayでCORSを設定することで、他のウェブアプリケーションからのリクエストを許可できます。本項目を有効化すると、API Gatewayは自動的にOPTIONSメソッドを作成し、適切なCORSヘッダー(例えば、Access-Control-Allow-Origin)を返すようにします。
②:メソッド
REST APIにおけるメソッドは、リソースに対する操作を定義する機能です。
主にHTTPプロトコルの動詞を利用して、リソースの取得・作成・更新・削除などのアクションを表現します。これにより、クライアントはサーバー上のリソースに対して意図した操作を明確に指定できるようになります。
<AWSの設定画面>
②-1 メソッドタイプ
クライアントがAPIに対して行うリクエストの種類を指定する設定項目です。
主なメソッドタイプには以下があります。
- GET
- サーバーからリソースを取得するためのメソッド。
- データの取得に使用され、リクエストは副作用を持たない(データを変更しない)。
- POST
- 新しいリソースをサーバーに作成するためのメソッド。
- データを送信し、サーバー側で新しいエントリを作成する際に使用される。
- PUT
- 既存のリソースを完全に更新するためのメソッド。
- 指定されたリソースを新しいデータで置き換える。
- PATCH
- 既存のリソースの部分的な更新を行うためのメソッド。
- リソース全体を送信せずに、変更する部分だけを指定する。
- DELETE
- 指定したリソースを削除するためのメソッド。
- リソースの消去をリクエストします。
②-2 統合タイプ
APIのリクエストを処理するバックエンドサービスの種類を指定する設定項目です。
主な統合タイプは以下の通りです。
- Lambda関数
- AWS Lambdaの関数を呼び出すための統合タイプ。
- HTTP
- 外部のHTTPエンドポイントにリクエストを送信するための統合タイプ。
- RESTful APIや他のWebサービスと連携可能。
- Mock
- ダミーのレスポンスを返す設定。
- テストや開発時にバックエンドが未実装の場合に役立つ。
- AWSのサービス
- 他のAWSサービス(S3やDynamoDBなど)と直接統合するための設定。
- 特定のAWSサービスの機能をAPIとして利用できる。
- VPCリンク
- Amazon VPC内のリソースにアクセスするための統合タイプ。
- セキュアな環境でのサービス連携を可能にする。
②-3 HTTP プロキシ統合
リクエストをHTTPエンドポイントに直接送信する設定です。
この統合では、統合リクエストや統合レスポンスのカスタマイズを行わず、クライアントからのリクエストをそのままバックエンドのHTTPサービスに転送します。これにより、シンプルかつ迅速に外部APIと連携できるため、迅速な実装が可能になります。
②-4 コンテンツの処理
リクエストやレスポンスのデータ形式を管理する設定項目で、主な選択肢は以下の通りです。
- パススルー
- リクエストのデータをそのままバックエンドに送信し、レスポンスもそのままクライアントに返します。データの変換は行わず、シンプルな転送を実現します。
- バイナリに変換
- リクエストやレスポンスのデータをバイナリ形式に変換します。特に画像やファイルなど、バイナリデータを扱う必要がある場合に利用されます。
- テキストに変換
- リクエストやレスポンスのデータをテキスト形式に変換します。主にJSONやXMLなどのテキストデータを扱う際に使用され、データの読みやすさを向上させます。
②-5 統合のタイムアウト
バックエンドサービスとの統合において、リクエストの処理にかかる最大時間を設定する項目です。
デフォルトでは、50ミリ秒から29,000ミリ秒(29秒)の範囲で設定できます。さらに、AWSのサービスクォータを使用することで、このタイムアウトを29,000ミリ秒よりも長く設定することも可能です。これにより、バックエンドが応答するまでの時間を調整し、過剰な待機を防ぐことができます。
②-6 メソッドリクエストの設定
- 認可
-
APIリクエストのアクセス制御を設定するためのもので、認証情報を要求することで、特定のユーザーやアプリケーションにのみアクセスを許可します。
「AWS IAM」を選択すると、特定のIAMユーザーやロールのみがAPIにアクセスできるようになり、セキュアな環境でのAPI利用が可能になります。
- リクエストバリデーター
-
リクエストの構造や内容が正しいかを検証するための設定です。JSONスキーマを使用して、リクエストパラメータやヘッダーの整合性を確認します。
- APIキーは必須です
-
クライアントがリクエストにAPIキーを含めなければ、バックエンドの処理を実行されないように設定します。
- オペレーション名
-
このメソッドを識別するための名前で、APIの管理やドキュメンテーションに役立ちます。
③:ステージ
「ステージ」は、APIの異なるバージョンや環境(例えば、開発、テスト、本番)を管理するための仕組みです。
各ステージは独自の設定やエンドポイントを持ち、APIのデプロイメントを柔軟に行えるようにします。これにより、異なる環境でのAPIの動作を分けて管理し、変更の影響を最小限に抑えることができます。
<AWSの設定画面>
②-1 APIキャッシュをプロビジョニング
APIのステージにキャッシュ機能を追加するための設定です。
この機能を有効にすると、GET
メソッドのみのレスポンスを一時的に保存し、次回のリクエスト時に再利用することができます。これによってパフォーマンスが向上し、バックエンドの負荷を軽減することが可能です。
②-2 キャッシュキャパシティ ※「②-1 APIキャッシュをプロビジョニング」を有効化した場合
APIキャッシュのサイズを指定するための設定です。
このキャパシティは、APIのレスポンスをどれだけ保存できるかを決定し、通常はメモリ単位(例えばMB)で指定します。適切なキャッシュキャパシティを設定することで、APIのパフォーマンスを最適化し、キャッシュヒット率を高めることでバックエンドへのリクエスト数を減少させることができます。
②-3 キャッシュの有効期限 (TTL) ※「②-1 APIキャッシュをプロビジョニング」を有効化した場合
キャッシュに保存されたレスポンスが、どれくらいの期間有効であるかを指定する設定です。
TTLを設定することで、キャッシュのデータが古くなる前に新しいリクエストが来た際に、どのタイミングでバックエンドから最新のデータを取得するかを制御できます。適切なTTLを設定することで、データの鮮度を保ちながら、キャッシュの利点を最大限に活かすことができます。
②-4 キー毎のキャッシュ無効化 ※「②-1 APIキャッシュをプロビジョニング」を有効化した場合
「認可が必要」を有効化すると、キャッシュ無効化の操作を行う際に認証が求められます。これにより、不正なユーザーがキャッシュを無効にするのを防ぎ、セキュリティを向上させることができます。
また「不正なリクエスト処理」は、APIが不正なリクエストに対してどのように応答するかを設定項目です。
- 403ステータスコードでリクエストに失敗する
- リクエストが失敗すると、403 Unauthorizedというレスポンスが返されます。この設定を行うには、APIで「FAIL_WITH_403」を使用します。
- キャッシュコントロールヘッダーを無視し、レスポンスに警告を追加する
- リクエストを処理し、そのレスポンスに警告を含めます。この設定は「SUCCEED_WITH_RESPONSE_HEADER」を使って行います。
- キャッシュコントロールヘッダーを無視する
- リクエストを処理し、レスポンスには警告を含めません。この場合の設定は「SUCCEED_WITHOUT_RESPONSE_HEADER」を使用します。
②-5 スロットリング
ユーザーが API を呼び出せるレートを制限すか否かを設定する項目です。
②-6 レート ※「②-5 スロットリング」を有効化した場合
クライアントが API を呼び出すことができるレートを 、1 秒あたりのリクエスト数で設定します。
②-7 バースト ※「②-5 スロットリング」を有効化した場合
クライアントがAPIに対して同時に送信できるリクエストの最大数を制限するための設定です。
この設定を行うことで、急激なリクエストの増加(バースト)に対してAPIのパフォーマンスを保ち、サーバーの負荷を軽減することができます。適切なバースト値を設定することで、APIの安定性を確保しつつ、必要なリクエストを処理できるようになります。
②-8 AWS WAF
AWS WAFを使用すると、不正なリクエストや攻撃からAPIを守るためのルールを設定できます。
これにより、特定のIPアドレスのブロックやSQLインジェクションなどの一般的な脅威に対する防御を強化し、安全にAPIを運用することが可能になります。
②-9 クライアント証明書
API Gatewayが送信するHTTPリクエストが正当なものであるかを確認するためのセキュリティ機能です。
この証明書を使用することで、APIの統合先がAPI Gatewayからのリクエストのみを受け入れるように設定できます。これにより、不正なアクセスを防ぎ、APIの安全性を向上させることが可能になります。
コメント