外部から AWS のバックエンドサービス利用を実現する仕組みをグラレコで解説

2020-04-01
AWS グラレコ解説

Author : 安田 茂樹

本連載では、様々な AWS サービスをグラフィックレコーディングで紹介する awsgeek.com を、日本語に翻訳し、図の解説をしていきます。

※ awsgeek.com は Amazon Web Services, Inc. プリンシパル・テクニカル・エバンジェリスト、ジェリー・ハーグローブが運営しているサイトです。

AWS では、「Amazon API Gateway」という、誰でも簡単に API の作成、公開、保守、モニタリング、保護が行えるフルマネージド型サービスを提供しています。
今回は、「Amazon API Gateway でできる事」と、「動作する仕組み」を図とともに見ていきましょう。

API とは ? ~ Amazon API Gateway でできること ~

API とは、 「Application Programming Interface」の略で、サービスの提供者が自身のサービスを外部の利用者が使えるようにするために提供するインタフェース(外部との窓口)のことです。アプリケーションの開発者は、既存の API を利用することにより、同じ機能を 1 から自身で開発する必要がないため、開発コスト・期間を減らすことができます。

AWS が提供するフルマネージド型サービスの Amazon API Gateway (以降、API Gatewayと略) を使うと、外部から AWS のバックエンドサービスや AWS 以外の HTTP ベースのサービスを利用するための窓口となる API を作成できます。
※API Gateway で作成できる API は、Web からアクセスできる「Web API」となります。本記事では、「API」と略します。

API Gateway では、以下の 3 つの種類の API を作成できます。作成する API の種類によって、外部からのリクエストを転送できるバックエンドサービスが異なります。

  • REST API :
    リクエストを転送できるバックエンドサービスは、Lambda 関数、AWS サービス、Mock、HTTP、VPC リンク。コネクション状態は保持しません (1 回きりのリクエストとレスポンス)。
  • HTTP API :
    リクエストを転送できるバックエンドサービスは、Lambda 関数、HTTP、プライベートリソース (ALB / NLB、Cloud Map)。コネクション状態は保持しません (1 回きりのリクエストとレスポンス)。
  • WebSocket API :
    リクエストを転送できるバックエンドサービスは、Lambda 関数、AWS サービス、Mock、HTTP、VPC リンク。コネクション状態を保持します (チャットなど、継続した双方向通信に適しています)。
     

API の設定を完了し、デプロイ (※APIを公開する事) すると、以下の形式で固有の呼び出し用 URL (エンドポイント URL と呼びます) が発行されます。

https://<api-id>.execute-api.<region-id>.amazonaws.com/<stage-name>/...

ユーザー側のアプリケーションがこのエンドポイント URL にリクエストを送ると、API Gateway はリクエストを受信した後、事前に設定されたバックエンドサービスにリクエストを転送します。作成した API の種類が「REST API」の場合、リクエストの転送先のバックエンドサービスは以下の中から事前に設定します。

  • Lambda関数 :
    特定のLambda関数を起動させて処理を行わせます。
  • AWSサービス (Amazon S3 / Amazon SNS / その他の AWS サービス) :
    Lambda関数以外のその他の対応する AWS サービスにリクエストを転送し、処理を行わせます。図では、Amazon S3 や Amazon SNS が例として挙げられています。
  • Mock (テスト用の API) :
    API Gateway に送られたリクエストに対し、バックエンドのサービスに接続せず、単純にレスポンスのみ返すダミーの API です。テスト目的で使います。
  • HTTP (AWS Elastic Beanstalk / Amazon EC2 / その他あらゆる HTTP エンドポイント) :
    HTTPSリクエストを受け付ける AWS および AWS 以外のサービスにリクエストを転送します。 

※なお、図には描かれていませんが、この他に、VPC リンクも選択可能です。

「REST API」を作成する場合、Swagger (OpenAPI) ファイルと呼ばれる API 定義ファイルをインポートし、API を作成することもできます。

また、上の図にある、AWS SAM (サーバーレスアプリケーションモデル) とは、CloudFormation のサーバーレス向け拡張機能のことです。

「SAM テンプレート」を使って、AWS Lambda、Amazon DynamoDB、Amazon API Gatewayといった AWS のサービスから構成されるサーバーレスアプリケーションを、容易に構築/更新/削除することができます。手作業ではなく、SAM テンプレートから AWS リソースを作成することで、手作業だと起こりうるミスを減らすことができます。

SAM テンプレートはサーバーレスに特化した記述方法となっており、CloudFormation と比べてよりシンプルに記述できます。

API Gateway が動作する仕組み

次に、API Gateway の動作フローを見ていきましょう。

API Gateway で「REST API」を作成する場合、エンドポイントタイプを以下の種類から選択します。

  • リージョン :
    デフォルトで選択されています。現在のリージョンを利用します。
  • エッジ最適化 :
    最も近い CloudFront のエッジサーバーを利用します。
  • プライベート :
    VPC からのみアクセスできるエンドポイントです。


エンドポイントタイプに、上記のうち「エッジ最適化」を選択した場合の API の動作フローは以下のようになります。

  1. .エンドユーザーのアプリケーションは、最も近い CloudFront のエッジサーバーにリクエストを送信します。
  2.  CloudFront から API Gateway にリクエストが転送されます。
  3. API Gateway がキャッシュを利用している場合は、キャッシュから取得、レスポンスします。
  4. キャッシュに無い場合は、事前に設定されたバックエンドサービスに転送します。その際に、スロットリングと呼ばれる流量制御を行います。詳しくは後ほどご説明します。
  5. スロットリングを無事通過したリクエストは、Lambda やその他の事前設定されたバックエンドサービスに届けられます。

スロットリングとは ?

「スロットリング」とは、流量制御のことです。

エンドポイントURLに対するリクエスト数が多すぎる場合、制限をかけることで、トラフィックの急増に対しバックエンドサービスを守ることができます。

Amazon API Gateway のスロットリングに関連する設定には、2 つの基本的なタイプがあります。

  • サーバー側のスロットリング制限 :
    全てのクライアントに適用されます。この制限設定は、リクエストが多すぎるために バックエンドサービスが処理しきれなくなることを防ぎます。
  • クライアントあたりのスロットリング制限 :
    クライアントごとに「使用量プラン」に応じて制限を行います。
こちらの図は、「REST API」を利用する場合のスロットリングの例を示しています。
スロットリングは、以下の段階ごとに実施されます。
 
  • AWS アカウントレベルのスロットリング :
    デフォルトでは、API Gateway はリクエストのレート (1 秒あたりのリクエスト数上限)を 10,000 リクエスト / 秒に制限しています。また、バースト (1 ミリ秒あたりのアクセス数上限) を AWS アカウント内のすべての API にわたって 5,000 リクエストに制限しています。リクエストやバーストの上限数を超えた場合には、HTTP ステータス 429 (Too Many Requests) エラーが返されます。
  • ステージ/メソッド :
    特定のステージまたは API の個別のメソッドで、AWS アカウントレベルのスロットリング制限をオーバーライド (上書き) し、上限値を設定できます。ただし、AWS アカウントレベルのスロットリングの上限値を超えることはできません。
  • API キー :
    クライアントの API キーごとに「使用量プラン」に基づいて、スロットリング制限を実施できます。
  • キー/メソッド :
    クライアントの「使用量プラン」に基づいて、メソッドレベルでの追加のスロットリング制限を実施できます。
 
 
クライアントの「使用量プラン」は、リクエストヘッダに入っている API キーによって判定します。使用量プランでは、以下のスロットリング制限を設定できます。
 
  • レート制限 :
    1 秒あたりのアクセス数上限
  • クオータ :
    1 日あたり、週あたり、または月あたりに可能なリクエストの数
  • API ステージ:
    アクセス可能な API と API のステージ

バックエンドサービスの変遷について

API Gateway が受信したリクエストの転送先となる AWS バックエンドサービスには、アーキテクチャ別に大まかに分けると以下の 3 つの種類があります。

  1. モノリス :
    モノリスとは、一枚岩のこと。大きな単一のアプリケーションを使ってあらゆる処理を行います。何か内部で 1 つでも問題が起こるとアプリケーション全体がダウンする可能性があります。常時起動するかどうかは、システム要件により異なります。
  2. マイクロサービス :
    特定の機能を持った、独立した小さなサービスのこと。通常は複数のマイクロサービスを疎結合で組み合わせて何らかの処理を行います。通常は常時起動したままにします。
  3. サーバーレス :
    サーバーを意識せずにアプリケーションを構築および実行できるサービスのこと。必要な時に、必要な時間だけ使います。(常時起動せず、処理完了後は破棄されます。)

現在は、アプリケーション全体のリスクを低減させ、開発スピードを上げるために、1. のモノリシックなシステムを分割し、2. のマイクロサービスや3.のサーバーレスに移行する流れが増えてきています。

API Gateway で「REST API」を利用する場合、バックエンドサービスの移行の流れに合わせて、Canary の設定 (カナリアリリースの設定) を行うことで、バックエンドサービスへのトラフィックのルーティング割合を設定し、トラフィックを 1. から 2. や 3. に徐々に移行することができます。

また、「REST API」を利用する場合、一般的なウェブの脆弱性から API を保護するために AWS WAF (Web アプリケーションファイアウォール) と統合し、Web リクエストを許可、ブロック、監視 (カウント) することができます。

料金体系について

最後に、料金体系について見ていきましょう。

API Gateway で「REST API」をご利用の場合、以下の 3 種類の料金がかかります。
初期費用は無料で全てご利用量に応じた従量課金制となっています。
※「HTTP API」および「WebSocket API」をご利用の場合、料金が異なります。別途料金ページをご確認ください。

  • データ転送料金 :
    データ転送量に応じて、EC2 のデータ転送料金 (GB あたりの従量制料金) が適用されます。EC2 同様に、アウトバウンド (AWS からインターネット) のデータ転送量に対してのみ料金がかかります。月間 150 TB の転送量に達するまで段階的に単価が下がります。
  • APIコール料金 :
    API Gateway が受信した API コール数に応じて課金されます。API コール数 100 万回あたりの料金となっており、コール数が多くなるほど 100 万回あたりの単価が段階的に下がります。
  • キャッシュ料金 :
    API Gateway にオプションでキャッシュを利用する場合の料金です。設定したキャッシュサイズに応じて、1 時間単位で課金されます。

※料金はリージョンごとに異なります。図の料金は、2020 年 3 月現在の米国東部 (バージニア北部) リージョンのものです。東京リージョンの料金に関しましては、別途料金ページをご確認ください。

最後に、全体の図を見てみましょう。

Amazon API Gateway の概要がなんとなくお分かりいただけましたでしょうか ?

バックエンドサービスへの窓口として使えるとても便利なサービスですので、興味を持たれた方は、この機会にぜひお試しください。

この連載記事のその他の記事はこちら

選択
  • 選択
  • 今話題のブロックチェーンをAWSで実現する仕組みをグラレコで解説 »
  • サーバーレスって何が便利なの ? AWS でサーバーレスを構築するためのサービスをグラレコで解説 »
  • 機械学習のワークフローってどうなっているの ? AWS の機械学習サービスをグラレコで解説 »
  • 外部から AWS のバックエンドサービス利用を実現する仕組みをグラレコで解説 »
  • AWS でデプロイの自動化を実現するベストプラクティスをグラレコで解説 »
  • コンテナを使ってモノリスを分割する方法をグラレコで解説 »
  • クラウドへ移行する理由とそのステップをグラレコで解説 »
  • Windows ワークロードをクラウドへ移行するためのベストプラクティスをグラレコで解説 »
  • サーバーレスのイベントバスって何 ? Amazon EventBridge をグラレコで解説 »
  • サーバーレスで SaaS を構築する方法をグラレコで解説 »
  • 「あなたへのおすすめ」はどう生成するの ? Amazon Personalize で簡単に実現する方法をグラレコで解説 »
  • クラウド設計・運用のベストプラクティス集「AWS Well-Architectedフレームワーク」をグラレコで解説 »
  • 特定の顧客セグメントにメッセージ送信。「Amazon Pinpoint」の仕組みをグラレコで解説 »
  • アプリにユーザー認証機能を簡単に追加できる「Amazon Cognito」をグラレコで解説 »
  • わずか数分で WordPress サイトを構築できる「Amazon Lightsail」をグラレコで解説 »
  • 異なるアプリケーション同士の疎結合を実現。「Amazon SQS」をグラレコで解説 »
  • Web アプリを高速に開発できる「AWS Amplify」をグラレコで解説 »
  • 機械学習の知識ゼロでもテキストデータを分析。Amazon Comprehend をグラレコで解説 »
  • ビジネスデータをまとめて可視化 & 分析。Amazon QuickSight をグラレコで解説
  • 人工衛星の地上局を 1 分単位で利用。AWS Ground Station をグラレコで解説
  • カオスエンジニアリングで本当にカオスにならないための進め方をグラレコで解説
  • GraphQL API を簡単に作成 & 運用。AWS AppSync をグラレコで解説
  • IoT 環境を必要な機能を選択するだけで構築。AWS IoT をグラレコで解説
  • 高い可用性と耐久性のオブジェクトストレージ。Amazon S3 をグラレコで解説
  • サーバーレスでイベント駆動型アプリケーションを実現。AWS Lambda をグラレコで解説
  • データサイエンス教育の強い味方。Amazon SageMaker Studio Lab をグラレコで解説
  • 高速で柔軟な NoSQL データベースサービス。Amazon DynamoDB をグラレコで解説
  • リレーショナルデータベースを簡単・迅速に実現。Amazon RDS をグラレコで解説
  • アプリのワークフローを視覚的に構成。 AWS Step Functions をグラレコで解説
  • データ保護に使う暗号化キーを一元管理。AWS KMS をグラレコで解説
  • アプリケーションへのトラフィックを効率的に負荷分散。Application Load Balancer をグラレコで解説
  • AWS で簡単にコンテナアプリケーションを構築 ! Amazon ECS をグラレコで解説
  • 大規模データセットも簡単クエリ! Amazon Athena をグラレコで解説
  • キャッシュ機能でアプリの高速化を実現 ! Amazon ElastiCache をグラレコで解説
  • 使い慣れたプログラミング言語でクラウド環境を構築 ! AWS CDK をグラレコで解説
  • ストリーミングデータを簡単にキャプチャ、処理、保存 ! Amazon Kinesis Data Streams をグラレコで解説
  • AWS で始める機械学習はじめの一歩 ! AWS の主要な AI/ML サービスをグラレコで解説
  • リレーショナルデータベースをサーバーレス化 ! Amazon Aurora Serverless をグラレコで解説
  • ML 駆動の検索エンジンで企業の情報管理を革新! Amazon Kendra をグラレコで解説
  • オンプレミス、エッジ、どこでも楽々コンテナ管理 ! Amazon EKS Anywhere をグラレコで解説

builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者紹介

安田 茂樹

アマゾン ウェブ サービス ジャパン合同会社
テクニカルコンテンツマネージャー。

2014 年にアマゾンジャパン合同会社に入社後、デバイス試験部門にて発売前の数多くの Amazon デバイスの試験に携わる。2019 年より現職。
趣味は新しいガジェットを試すこと、旅行、食べ歩き。

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する