##目標
API Gatewayを利用して、Lambda関数(DynamoDB内データを取得する関数、Rubyでの作成とする。)実行API(※)を作成する。
※作成するAPIの詳細要件
・URLのクエリパラメータとしてDynamoDBのプライマリキー情報を指定し、取得するデータを絞り込む。
・クエリパラメータが指定されていない場合、ステータスコード400エラーを返す。
・DynamoDBからクエリパラメータに紐づくデータを取得出来ない場合も同様に、ステータスコード400エラーを返す。
##API Gatewayとは
API Gatewayを利用することでバックエンドリソースのLamda関数、その他AWSサービス、httpエンドポイントに対するRestfulAPI(※1)やWebSocketAPI(※2)を作成することが可能となります。
API Gatewayに関するより詳細な知識を掲載している記事のリンク記載致します。
Amazon API Gateway
※1
URLには処理対象のリソースを指定するだけで、どのような処理を行うかは(URL文字列でなく)httpのメソッドに一任することを可能としているAPIのこと
※2
WEBの双方向通信用プロトコル、通常のクライアント起点⇒サーバ通信だけでなく、サーバ起点⇒クライアント通信も可能とする。リアルタイムチェットアプリケーション等で利用
##構成図
①メソッドリクエスト
クライアントからAPIゲートウェイによって作成されたAPIを利用してhttpsアクセスします。
ここでクエリパラメータとしてDynamoDBのプライマリキー情報指定を必須とするよう設定を行います。
②統合リクエスト
アップストリーム(API Gatewayのバックエンド)であるLambda関数へリクエストを投げます。
ここでLambdaプロキシ統合という機能を利用して、LambdaにURLクエリパラメータを渡す設定を行います。
③DynamoDBアクセス
Lambda関数を実行し、その関数内処理からDynamoDBへアクセスします(AWS SDK For Ruby利用)。
④DynamoDBデータ取得
DynamoDBからクエリパラメータに指定した情報に紐づくデータを取得します。
⑤統合レスポンス
Lambda関数の実行結果がAPI Gatewayへレスポンスされます。
(今回はLambdaプロキシ統合を利用しているためステータスコードのマッピング設定等不要)
⑥メソッドレスポンス
API Gatewayからクライアントへレスポンスを返します。
##作業の流れ
項番 | タイトル |
---|---|
1 | DynamoDBテーブルの作成 |
2 | Lambda関数の作成 |
3 | APIの作成 |
4 | 動作検証 |
##手順 | |
###1.DynamoDBテーブルの作成 | |
本記事では大まかな流れだけの説明と致します(※)。 | |
テーブル名はtest-table 、プライマリキーはid (数値型)で作成 |
|
※Dynamoの基本的な構築手順は以下で記載 | |
【AWS DynamoDB】基本構築 | |
作成したテーブルに以下のように、name属性をアペンドした項目をテストデータとして追加します。 | |
###2.Lambda関数の作成 | |
本記事では大まかな流れだけの説明と致します。 | |
関数名はdynamodb-get で開発言語はRuby.2.7 として作成 |
|
※以前実施したLambda関数の基本構築は以下記事 | |
【AWS Lambda】S3に保存された画像をリサイズして別S3に保存(Ruby利用) | |
以下のコードをLambda関数のコードとして利用します。 |
require 'aws-sdk'
def lambda_handler(event:, context:)
dynamoDB = Aws::DynamoDB::Resource.new(region: 'ap-northeast-1')
table = dynamoDB.table('test-table')
# クエリパラメータで指定されたidに紐づくデータを取得する
resp = table.get_item({
key: { 'id' => event["queryStringParameters"]["id"].to_i }
})
# 取得結果に応じたレスポンス返す。
if resp["item"]
{
'statusCode': 200,
'body': resp.item['name']
}
else
{
'statusCode': 400,
'body': JSON.generate({message: "The user with the specified id(#{event["queryStringParameters"]["id"]}) cannot be found!"})
}
end
end
Lambda関数からDynamoDBへアクセスをかけるため、AmazonDynamoDBFullAccess
のAWS管理ポリシーをLambdaの実行ロールにアタッチします。
###3.APIの作成
①API作成開始
「サービス」⇒「API Gateway」からAPIの作成
をクリック
②APIタイプの選択
今回はREST APIでのAPI作成とします。
REST API
欄の構築
をクリック
③APIの詳細設定
以下のように各項目(※)を選択します。
※エンドポイントタイプについて(AWSドキュメント抜粋)
リージョン:現在設定しているリージョンにAPIのエンドポイントが割り当てられます。
エッジ最適化:地理的に分散されたクライアントに最適です。APIリクエストは、最寄りの CloudFrontネットワークにルーティングされます。
プライベート:VPCからしかアクセスできない API エンドポイントです。
③メソッドの作成
アクションのプルダウンメニューからメソッドの作成
をクリック
GET
メソッドを選択した後、チェックマークをクリック
次に、API Gatewayがどのリソースと統合(連携)を行うかという設定を行います。
今回はLambda関数と統合し、かつLambdaプロキシ統合の使用
(※1)を行います。
Lambda関数欄には先ほど作成したLambda関数dynamodb-get
を記載
※1Lambdaプロキシの統合
API GatewayをLambda関数と統合させる場合、個人的にはこれを使った方が実装かなり楽でした。
Lambdaプロキシの統合を使用することで、API Gatewayから対象のLambda関数へevent(Lambda関数内で使用できるイベントソースから送られてくる情報)を自動フォーマット調整して送信することが可能となります。
また、Lambda関数からAPI Gatewayへのレスポンス内容は自動的にフォーマット調整され、統合レスポンスでのステータスコードマッピング調整等が不要となります。
以下記事でLambdaプロキシ統合に関する詳細が記載してあり、分かりやすかったです。
API Gateway + Lambda プロキシ結合の使用有無による違い
API GatewayがLambda関数へアクセス出来るよう権限追加(※2)を行います。OK
クリック
※2ちなみに、この後Lambda関数のトリガーにAPI Gatewayが自動設定されました。
④リクエストの調整
メソッドリクエストを調整することで、URLにクエリパラメータを付加することを必須にします。
作成したAPIのメソッドリクエスト
をクリック
※余談
Lambdaプロキシ統合を利用すると、統合リクエスト、統合レスポンス、メソッドレスポンスに関しては自動でLambdaプロキシ仕様になり、基本的には調整が不要となることがリクエストレスポンス調整画面からわかります。
リクエストの検証にクエリ文字列パラメータおよびヘッダーの検証
を選択することで、クエリパラメータの検証を有効化(API Gatewayがクエリパラメータの内容をチェックするようになる)させます。
選択したらチェックをクリック
URLクエリ文字列パラメータ欄の名前にid
(DynamoDBテーブルのプライマリキー)を入力してチェックをクリック
更に必須
にチェックを入れ、これをクエリパラメータに指定することを必須(もしクエリパラメータを指定しなかった場合エラーでアクセス拒否します)とします。
⑤デプロイ前検証
APIのデプロイ前にテストを行います。
作成したAPIの詳細画面からテスト
クリック
クエリ文字列欄にid=1
を入力し、テスト
をクリック
ステータスコードが200で、レスポンス本文に先ほど作成したDynamoDBテーブルのidが1である項目に紐づいたデータがレスポンスされればOKです。
⑥APIのデプロイ
作成したAPIを実際に外部から利用可能にするためデプロイを行います。
作成したAPIを選択した状態で、アクション
⇒APIのデプロイ
をクリック
APIのデプロイを行うためには、ステージを作成する必要があるため、新しいステージ
をクリック
ステージ名はtest
でデプロイ
をクリック
URLの呼び出し欄にデプロイされたAPIが表示されます。
###4.動作検証
※テストデータとして使用するDynamoDBテーブルは以下の内容
①DynamoDBテーブルに存在するidをクエリパラメータとして指定(正常系)
APIのデプロイ実行後にURLの呼び出し欄に記載されたURLに、クエリパラメータにid=1
を指定してブラウザアクセスします。
以下のように、ステータスコード200(正常)かつ、DynamoDBテーブルのidが1である項目のnameが表示されます。
②クエリパラメータを指定しない(異常系1)
クエリパラメータを指定せずブラウザアクセスをします。
ステータスコード400エラーで、必須クエリパラメータが指定されてないことを示すエラーメッセージが出ます。
③DynamoDBテーブルに存在しないidをクエリパラメータとして指定(異常系2)
クエリパラメータにDynamoDBに存在しないid=5
を指定してブラウザアクセスします。
ステータスコード400エラーで、指定されたidに紐づくデータが存在しないことを示すメッセージが出ます