2
1

More than 1 year has passed since last update.

API Gateway→Lambda→DynamoDBとデータを受け渡す

Posted at

背景

最近業務外でサーバレス系サービスに触れる機会が増えました。せっかくなので理解を深めようと考え、タイトルの3サービスを触ったのでそれについての備忘です。サクッと作成できるので、興味がある方はぜひお手元の環境でお試しください。なお、DynamoDBとLambdaの構築は慣れている方が多いので構築手順は省いています。本記事の内容は以下のUdemy講座を参考にしています。

構築する内容

image.png

DynamoDBの用意

テーブル名はusersとして、パーティションキーid文字列のみ設定します。

Lambdaの用意

この後作成するAPI GWからデータを受け取り、DynamoDBに格納するコードです。
ランタイムはPython 3.9で、LambdaのロールにはAWSLambdaBasicExecutionRoleAmazonDynamoDBFullAccessをアタッチしています。

import boto3
import json

dynamodb = boto3.client('dynamodb')

def post_users(requestJSON):
    dynamodb.put_item(
        TableName='users',
        Item={
            'id': {'S': requestJSON['id']},
            'name': {'S': requestJSON['name']},
            'age': {'N': requestJSON['age']}
        }
    )

def lambda_handler(event, context):
    # 受け取ったデータを文字列でなくJSONだと解釈
    requestJSON = json.loads(event['body'])
    post_users(requestJSON)

API Gatewayの用意

API Gatewayはあまり経験がなかったので、細かく書いていきます。

REST API作成

image.png

リソースとメソッドの作成

image.png

統合リクエストの編集

画面が遷移しますので、統合リクエストの編集を行います。
image.png
クライアントから送るデータはそのままLambdaに受け渡すとエラーを吐いてしまうため、マッピングテンプレートを用いてLambda用にデータを整形します。
マッピングテンプレート名はapplication/jsonとし、内容は以下のように記載します。これでLambdaにevent['body']の形でデータを渡すことができ、KeyErrorを回避できます。

{
    "body" : "$util.escapeJavaScript($input.body)"
}

image.png

APIのデプロイ

作成したAPIはデプロイすることで、実際に使えるようになります。デプロイ後、サイドバーのPOSTを押します。画面に表示される、/usersで終わるURLはすぐ使うので、メモをお忘れなく。
image.png
これで全てのリソースの作成が完了しました。

curlコマンドでデータを送る

下記コマンドを入力します。
-d以降は最初と最後以外の"に対して\でエスケープ処理を加えています。ドメイン名の部分は直前にコピーした/usersで終わるURLを張り付けてください。

curl -X POST -H "Content-Type: application/json" -d "{\"id\":\"1000\",\"name\":\"Taro\",\"age\":\"22\"}" /usersで終わるURL

# 出力結果(Lambdaで返す値を設定していないためnull)
null

データが格納されることを確認

作成したDynamoDBの項目の中身を見て、格納されていれば成功です。
image.png

最後に

今回はAPI Gateway、Lambda、DynamoDBとデータを受け渡す仕組みを構築しました。本記事では内容を省いていますがAPI Gatewayを構築する中で、REST APIについての理解も深まったので勉強できてよかったです。ここまでお読みいただきありがとうございました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1