サーバーレスアーキテクチャで翻訳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=翻訳する日本語
Discussion