サーバーレスアーキテクチャで翻訳Web APIを構築する③
前回
下記ハンズオンを参照
Amazon DynamoDB ハンズオン①、②
Amazon DynamoDBを用いてテーブルを作成し、Web APIが呼ばれたときに履歴情報をテーブルに記録するLambda Functionを設定する。


構成図

DynamoDBテーブルの作成
マネジメントコンソールから「DynamoDB」検索。
"テーブルの作成"をクリック。

テーブル名、パーティションキーを入力。

「テーブル設定」を"設定をカスタマイズ"に変更する。

「読み込み/書き込みキャパシティーの設定」で「読み込み/書き込みキャパシティー」のAuto Scalingをオフにして、プロビジョンドキャパシティーユニットを"1"にする。

画面下の"テーブルの作成"をクリック。

データを手動で入れてみる
作成した"translate-history"をクリック。

「インデックス」を選択。
「アクション」タブを開いて"項目を作成"をクリック。

「新しい属性の追加」タブを開き、文字列を選択して属性を追加する。
画像を例に入力して"項目を作成"をクリック。

項目が作成されたことが確認できる。

Lambda関数の修正
マネジメントコンソールで「Lambda」を検索。
前回作成したLambda関数をクリック。

コードソースを以下のコードに書き換える。
その後"デプロイ"をクリック。
import json
import boto3
import datetime
translate = boto3.client(service_name='translate')
dynamodb_translate_history_tbl = boto3.resource('dynamodb').Table('translate-history')
def lambda_handler(event, context):
input_text = event['queryStringParameters']['input_text']
response = translate.translate_text(
Text=input_text,
SourceLanguageCode="ja",
TargetLanguageCode="en"
)
output_text = response.get('TranslatedText')
dynamodb_translate_history_tbl.put_item(
Item = {
"timestamp": datetime.datetime.now().strftime("%Y%m%d%H%M%S"),
"input_text": input_text,
"output_text": output_text
}
)
return {
'statusCode': 200,
'body': json.dumps({
'output_text': output_text
}),
'isBase64Encoded': False,
'headers': {}
}

IAM ロールを追加
「設定」タブの「アクセス権限」を選択。
「実行ロール」の「ロール名」クリック。

「許可を追加」を選択して"ポリシーをアタッチ"をクリック。

検索してAmazonDynamoDBFullAccessを選択。
"許可を追加"をクリック。

APIのテストをする
Lambdaコンソールに戻る。
コードソース上にある「Test」タブを開いて"Configure test event"をクリック。

「新しいイベントを作成」を選択し、イベント名入力。

「テンプレート」から「API Gateway AWS Proxy」を選択する。

画像赤枠の箇所を以下のコードに修正する。
"queryStringParameters": {
"input_text": "こんばんは"
}

"保存"をクリック。

"テスト"をクリック。

以下の結果が返ってくる。

DynamoDBに項目が追加されたことを確認する。
先ほど作成したテーブルを確認すると項目が追加されたことが分かる。

APIを叩く
前回作成したAPI Gatewayのステージを選択。
「dev」を展開して「GET」を選択。
URLをコピーする。

/translate以下にクエリパラメータを入力してAPIを呼び出す。
/dev/translate?input_text=翻訳する日本語

DynamoDBに項目が追加されたことを確認する。

Discussion