目指せ語学マスター ハンズオンで翻訳Web APIつくってみた ~Ⅲ:DynamoDB編~

代表的な三部作と言われたら何を思い浮かべますか?と聞かれたらやはり「ギャバン」「シャリバン」「シャイダー」の宇宙刑事シリーズですね。引き続きハンズオンでServerlessな翻訳Web API作ってみましたので公開させて頂きます。
2020.11.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

代表的な三部作と言われたら何を思い浮かべますか?と聞かれたらやはり「ギャバン」「シャリバン」「シャイダー」の宇宙刑事シリーズですね。特にギャバンの龍のロボット。欲しかったなぁ~。。。
さて、今回は「目指せ語学マスター ハンズオンで翻訳Web APIつくってみた ~Ⅱ:API Gateway編~」の続きで「~Ⅲ:DynamoDB編~」です。
引き続き「AWS Hands-on for Beginners 〜Serverless #1〜」で翻訳Web APIをつくっていきましょう。
同じようにServerlessを体験してみようとお考えの方の参考になれば幸いです。

AWS Hands-on for Beginners 〜Serverless #1〜

このハンズオンは以下の構成となっていています。
  1. Serverlessアーキテクチャの概要
  2. AWS Lambdaの概要
  3. AWS Lambdaハンズオン① Lambdaを単体で使ってみる
  4. AWS Lambdaハンズオン② 他のサービスを呼び出してみる
  5. Amazon API Gatewayの概要
  6. Amazon API Gatewayハンズオン① API Gatewayを単体で使ってみる
  7. Amazon API Gatewayハンズオン② API GatewayとLambdaを組み合わせる
  8. Amazon DynamoDBの概要
  9. Amazon DynamoDBハンズオン① テーブルを作ってみる
  10. Amazon DynamoDBハンズオン② API GatewayとLambdaとDynamoDBを組み合わせる

最終的な構成図はこんな感じになります。 (構成図はハンズオン資料からの抜粋です)

前回まででAPI GatewayとLambdaを組み合わせてみましたので今回はDynamoDBをさわって、最終的にはAPI GatewayとLambdaとDynamoDBを組み合わせてみたいと思います。よっしゃー、がんばってやっていきましょう。
前回までのハンズオンの内容が気になる方ははこちらからどうぞ。
目指せ語学マスター ハンズオンで翻訳Web APIつくってみた ~Ⅰ:Lambda編~
目指せ語学マスター ハンズオンで翻訳Web APIつくってみた ~Ⅱ:API Gateway編~

DynamoDBでテーブルを作ってみる

API GatewayとLambdaと連携する前にDynamoDBのテーブルを作ってさわってみましょう。
20年前、当時はオンプレなので商用・開発・検証環境と構成が違うのでDB設定も違い、うまく設定できなくて若手のDB担当に泣きつかれたのも今ではいい思い出です。
AWSだと同じ構成のインスタンスを簡単に用意できるのでいいですよね~。

テーブルを作成してみる

初DynamoDBですので「テーブルの作成」を押してテーブルをつくってみましょう。

テーブル名とプライマリーキーを入力します。今回はソートキーは使用しません。
テーブル設定の「デフォルト設定の使用」にチェックが入っていますがハンズオンではデフォルト設定よりもミニマムで利用しますのでチェックを外しましょう。

Auto Scalingの設定もデフォルトだとチェックされているのでこちらも読み込み・書き込みキャパシティー両方ともチェックを外します。キャパシティーユニットもデフォルトでは「5」なのですが、読み込み・書き込みキャパシティーユニットともに「1」にして作成しましょう。

無事にテーブルが作成されましたね。初めてDynamoDBでテーブル作成してみましたが、他のインスタンスでもそうですがオンプレの環境構築に比べると圧倒的に早く、そして楽ですね。体験するとより実感します。

アイテムを追加してみる

それでは作成したテーブルへ手作業でアイテムを追加してみましょう。
項目タブを選択し「項目の作成」ボタンを押して作成していきます。

プライマリーキー(文字列型のタイムススタンプ)の他に「inpute_text」と「output_text」を追加して保存します。

手作業での追加なので特に問題なくアイテムが作成されたと思います。
どうでもいいですが、DynamoDBと聞くと勝手に脳内でアイダホポテトがイメージされるのは私だけですね。。。

API GatewayとLambdaとDynamoDBを組み合わせる

いよいよAPI GatewayとLambda、DynamoDBを組み合わせてみましょう。とうとう翻訳Web APIを作ってみちゃうんですね。
まずは、Lambda関数で処理した結果をDynamoDBへ追加できるように修正していきます。
ちなみに以下のコードにはエラーが含まれています。その詳細は後述していきますね。。。
(成功しているのは修正したコードでテスト実行しているからです)

次にIAMロールにDynamoDBへのアクセス権限を追加していきます。
今回はフルアクセスが可能な権限を設定していますが、本番の際にはどのような場合でも必要最低限の権限設定を心がけたいですね。

IAMロールへ権限を追加できました。

まずはLambda関数からDynamoDBのテーブルへアイテムが追加できるかテストしてみます。
分かりやすいようにテストイベントのinput_textを変更してテストしてみましょう。

テストしてみましょう。
DynamoDBのテーブルへアイテムが追加できました。(この時2回テストしています)

翻訳Web APIを動かしてみる

それではAPI GatewayのURLから実行してみましょう。
input_textとして「ハンズオン完走しました」と入力して実行してみます。
API GatewayからLambda関数が呼び出されinput_text(日本語)が翻訳されoutput_text(英語)へ格納されてDynamoDBへアイテムとして追加されました。やったね。やったね!

やらかしと+α

ここからはハンズオンの中でやらかしちゃったことと+αでやってみたことを公開しまーす。

エラー

まずはやらかしから。「API GatewayとLambdaとDynamoDBを組み合わせる」の中でも書きましたが、はじめにテスト実行した際はエラーになってしまいました。

な、なぜエラー? ハンズオンどおりにやったのにー。(じたばた)
よくよくログを見ると「dynamodb.Table」オブジェクトに『put_intem』なんてないよおじさん!と、言われてますね。
『put_intem』ではなく『put_item』ですね。ハハハ。。。 単なる打ち間違いでした。
ハンズオンで使用するコードは公開されているのでそれをコピーすればいいのですが、私はなんとなく自分で打ちたい派なんですよね。

『put_intem』を『put_item』に修正して再テストしましょう。

今度はうまくできました。打ち間違いはしょうがないですよね。

タイムスタンプへの日本標準時間の設定

ハンズオンの中で講師の方がタイムスタンプはUTC(協定世界時)でJST(日本標準時)にすることもできるけど、ハンズオンの本質からズレるのでUTCのままでやります。ということを言われていました。
じゃあ本質からズレましょう。JSTで設定するようにしてみます。

実行結果はこんな感じですね。

タイムスタンプへの出力形式変更

さらに本質からはズレていきますが、タイムスタンプが見ずらいので見やすく表示形式を変えてみましょう。

個人的にはスッキリしました。

まとめ

ここまでサーバレスで翻訳Web APIを作ってみてLambda、API Gateway、DynamoDBの連携を体験し、それぞれのサービスについて座学よりも多くの知識を学ぶことができたと思います。
なによりこんなにサクッと翻訳Web APIを作ってみることができたことがとても楽しかったです。
本格的に翻訳Web APIを作るにはAIと連携して学習させつつ、翻訳の精度を向上させていかないと英語学習で利用するには難しいのかなと思いました。(私の第二の英語教師、Google翻訳先生は偉大だなと実感しました)
この後はAIで機械学習していくのも楽しそうですし、音声から自動翻訳させるようにレベルアップしていくのもいいかなぁなんて考えています。
本番稼働させようとした場合にはセキュリティやネットワーク構成のことも考慮していかなければなりませんし、まだまだ勉強していくことは多いと改めて実感したハンズオンでした。
同じようにServerlessを体験してみようとお考えの方の参考になれば幸いです。