AWS Lambda の Lambda 関数を使ってサーバーレスに API バックエンド処理をしてみます。
Contents
Amazon API Gateway
Amazon API Gateway により HTTPS 経由で AWS Lambda 関数を呼び出します。
特徴
- API に対する呼び出しと、送出されるデータに対してのみ料金が発生
- 最低料金や前払いの義務は発生なし
- Amazon CloudFront と統合した API Gateway でレスポンスをレイテンシーを低くすることも可能
- API 呼び出しに対する出力をキャッシュして、API のパフォーマンスを向上させることも可能
- Amazon CloudWatch によってモニタリング可能
- バージョン管理可能
料金
アジアパシフィック (東京)の場合
100 万回の API 呼び出しの受信につき 4.25 USD のレート + データの送出の費用がギガバイト単位で加算
データ転送費用
- 最初の 10 TB につき、0.14 USD/GB
- 次の 40 TB につき、0.135 USD/GB
- 次の 100 TB につき、0.13 USD/GB
- 次の 350 TB につき、0.12 USD/GB
オプションで API の各ステージに専用のキャッシュをプロビジョニングすることが可能
- 0.5 GB につき、0.028 USD / h
- 1.6 GB につき、 0.054 USD / h
- 6.1 GB につき、 0.245 USD / h
- 13.5 GB につき、 0.290 USD / h
- 28.4 GB につき、 0.560 USD / h
- 58.2 GB につき、 1.10 USD / h
- 118.0 GB につき、 2.20 USD / h
- 237.0 GB につき、 4.40 USD / h
APIバックエンドの実装
Amazon DynamoDB を作成して、Amazon API Gateway から Lambda 関数を呼び出し、操作する APIバックエンドの実装を行ってみます。
DynamoDB テーブルを作成
Amazon DynamoDB のコンソールから「テーブルの作成」を行います。
「テーブル名」と「プライマリーキー」を設定して作成します。
次に、IAM ロールの作成を行います。「AWS Lambda」を選択して DynamoDB の権限をアタッチし、ロール名を設定したら「ロールの作成」を行います。
次に、作成したロールで「ポリシーのアタッチ」で CloudWatch の権限もアタッチしておきます。
デプロイパッケージを作成
Lambda 関数デプロイパッケージを作成します。
- Lambda 関数用の js ファイルを作成
- zip で圧縮
実行ロール (IAM ロール) を作成
IAM コンソールの左ペインの項目から「ロール」を選択して「ロールの作成」からエンティティの種類を「AWS サービス」にして、許可するサービスを選択します。
今回は「API Gateway」を選択します。
次に、ロールにアタッチするアクセス権限ポリシーを選択します。
次に、ロール名を決めて作成します。
いったん作成だけして後に「インラインポリシーの追加」から JSON でも追加可能です。
Lambda 関数を作成
デプロイパッケージをアップロードして、Lambda 関数を作成
DynamoDB を操作する内容で試してみます。
ロールは DynamoDB と CloudWatch Logs のアクセス権限ポリシーを設定したロールを使います。
テスト
Lambda 関数に圧縮した zip ファイルをアップロードして手動でテスト
テンプレートから中身を Lambda 関数に合わせた json 形式に変更して実行します。
Amazon API Gateway を使用して API を作成
HTTPS リクエストが API メソッドに送信されたら、Amazon API Gateway から Lambda 関数を呼び出すようにします。Amazon API Gateway で API を作成し、その中にリソースに、「GET」「POST」などの HTTP メソッドを用意します。
まず、Amazon API Gateway を使用して、POST メソッドを Lambda 関数に関連付けます。
手順は下記となります。
- API 作成
- API のリソース作成 (DynamoDBManager)
- リソースに対するメソッド作成 (POST)
- Lambda 関数を POST メソッドの送信先に設定
- API をデプロイ
- Amazon API Gateway が Lambda 関数を呼び出すためのアクセス権限を付与
新しい API の作成を行っていきます。
まず、「Amazon API Gateway」コンソールから「新しい API」を選択し、「API 名」を設定します。
次に、「アクション」から「リソースの作成」を選択し「リソース名」を設定して「リソースの作成」を行います。
次に、メソッドで「アクション」から「メソッドの作成」を選択し「PUT」と「GET」の設定をします。
セットアップで「統合タイプ」「Lambda プロキシ統合の使用」「Lambda リージョン」「Lambda 関数」「デフォルトタイムアウトの使用」を設定して保存をします。
次に、メソッドの実行で「統合リクエスト」をクリックして「本文マッピングテンプレート」の「マッピングテンプレートの追加」から「Content-Type」に「application/json」を設定します。
次に、「application/json」を選択しマッピングテンプレートを設定します。
次に、作成した API を「アクション」から「API のデプロイ」で「デプロイ先のステージ」選択と「ステージ名」を入力してデプロイします。
すると、「URL の呼び出し」が表示されます。
これが API のエンドポイントになります。
テスト
HTTPS リクエストの送信テスト
curl や REST client などで、json 形式で送信して正常レスポンスか確認します。
PUT メソッドで、DynamoDB にレコードが追加されているか確認
GET メソッドで、追加されたレコードの取得を確認
正常に API 送信ができ、追加と取得ともに確認できました。
まとめ
Amazon API Gateway + AWS Lambda で構成することでサーバーレスにサービスを構築することが可能となります。安定したサービスでなく負荷が急に増減したりするようなサービスや複雑な構成でないサービスではインフラの心配や管理コストを抑えられそうです。
参考
AWS Lambda (サーバーレスでコードを実行・自動管理)
Amazon API Gateway での AWS Lambda の使用 (オンデマンド HTTPS 経由)
Lambda と API Gateway を使用してシンプルなマイクロサービスを作成する