API Gateway、Lambda、DynamoDBを組み合わせて翻訳Web APIを完成させてみた

## はじめに
こんにちは。
今回は以下の構成を完成させたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/2f3033b7-c681-65b9-be71-14cd95dc73c9.png)

本記事は以下記事の続編です。

https://qiita.com/uccy/items/7532a37fdd3a5c62651d

気が付いたらマネジメントコンソールのUIが変わっていました。

## やってみた
まずは、マネジメントコンソールからLambdaのページに移動します。
[「AWS Lambdaを単体で動かしてみた」](https://qiita.com/uccy/items/aaa0d9931095f6e05ba2)で作成したLambda関数（translate-function）を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/4dd4e0a9-94c3-c827-84f6-3cb94cd42b48.png)

以下のページを参考に、Lambda関数を修正していきます。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/table/index.html

以下画像の赤枠部分をコピーします。
import boto3は既にLambda関数に記述されているためコピーしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/477dfe9e-168a-cd2c-dbef-1972701272a9.png)

コピーしたコードを6-7行目に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/b8379a54-b6de-2718-2d16-c272f93faffc.png)

貼り付けたコードを以下のように修正します。
テーブルに直接アクセスするコードを1行でまとめています。
```python
dynamodb_translate_history_tbl = boto3.resource('dynamodb').Table('translate-history')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/ef7d03ad-71d1-2489-7077-33ff9510f5f2.png)

先程のページ（Boto3 documentation）に戻り、下にスクロールして「put_item」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/f49709ad-4b71-5faa-c882-a90b402fbaaa.png)

色々なSyntaxが記載されていますが、今回参考にするのは2-4行目のItemの箇所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/9ba3739e-75ce-8e13-e7d1-904cfa8ab48b.png)

3行目と21-27行目の箇所を追記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/dd680482-8bf1-ae1c-b845-6dba630c881a.png)

↓3行目のコード
（タイムスタンプを取得するためのPythonモジュールをインポートしています。）
```python
import datetime
```

↓21-27行目のコード
（DynamoDBにタイムスタンプ、入力文、出力文を追加するコードです。）
```python
    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
        }
    )
```

修正後、左側のDeployボタンをクリックします。
クリック後、以下のようなメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/f942168c-32b9-3d12-ffd2-28417a3c7b12.png)

Lambda関数のIAMロールにdynamoDBへのアクセス権限が付与されていないので、付与します。
「設定」→「アクセス権限」→ロール名をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/ebab182d-287e-64ef-ea01-26c42df7743b.png)

「ポリシーをアタッチ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/78a67eb7-b29c-bbf6-e007-4367ba4832fd.png)

「dynamodb」を検索し、「AmazonDynamoDBFullAccess」にチェックを入れ、「許可を追加」をクリックします。
本来であれば必要最低限の権限に絞るべきではあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/f75a290d-d2dc-74e3-2fe2-3e4e97120085.png)

追加後、以下のようなメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/a31b26d0-464f-9d76-fffa-3149101da4e9.png)

Lambdaのページに戻り、「テスト」タブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/754e2eee-4661-cb82-aabd-54af1abc20e5.png)

テストイベントを修正します。
8行目の元々「こんにちは」だった箇所を「こんばんは」に修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/5834e187-4119-c4fa-1de1-31a2c9a50211.png)

修正後、「保存」→「テスト」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/ae04ef5a-93c4-3df1-1011-c92694aa4dfe.png)

成功しました。「Good evening」と表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/8dfe1db5-617d-fad5-34cb-41ff62b6995e.png)

DynamoDBに履歴が残っているか確認してみます。
DynamoDBのページに移動し、「項目を探索」→「translate-history」をクリックします。
すると、先ほどの履歴（青枠箇所）が入ってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/c180c719-c23c-b7cb-9459-a494446668b8.png)

次はAPIの動作を確認してみます。
API-Gatewayのページを開き、[「Amazon API GatewayでMock APIを作ってみた」](https://qiita.com/uccy/items/33ffdcc855e54e1ba1fe)で作成したtranslate-apiを開きます。
「ステージ」→「GET」→URLをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/b67c383d-b2d9-c25c-7a6b-051d143e0a51.png)

コピーしたURLをブラウザのURL入力欄に貼り付けます。
"?"移行を入力します。
「ハンズオン完走しました」の部分は英語にした好きな日本語を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/929b07ab-6f60-7dd9-15dc-ca33df83e0de.png)

入力後、Enterを叩きます。
英語に変換されたテキストが出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/07a1e5d0-100c-f302-2347-0f9dfd3d08de.png)

DynamoDBの方にもしっかり履歴が記録されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/f9b1b70c-d931-04be-bce2-cd92fd73745d.png)

ようやくこの構成が完成しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/11fc7e24-694b-a65c-438d-716bb5adf5af.png)

## おわりに
ちょっと時間がかかってしまいましたが、無事にハンズオンを終えることができました。
今後もやったことの足跡を付けていこうと思います！

![AdobeStock_482977927.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/de4c3bea-b421-4a50-ca7e-a7649794a9df.jpeg)