AWS Hands-on for Beginners 〜Serverless 編〜　#1(2)

## はじめに
勉強していることをなんとなくメモっていきます。

行うこと
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/
サーバーレスアーキテクチャで翻訳 Web API を構築する 
自分宛のメモを残していきます。

本人情報
IT現場雑用員（一生エクセル触ってる人）
社会人2年目、脳死資格取得男、最近SAPに受かった。


AWS Hands-on for Beginners 〜Serverless 編〜　　#１　　の続きです。
<br>

## DynamoDBについて
### DynamoDBの特徴
**1. フルマネージド型のNoSQLデータベースサービス**
マネージドサービスなのでソフトウェアのインストールなどは必要にならず、起動さえできればすぐにデータベースとして使い始められます。キーバリュー型のデータベースであり、セッション情報の管理などにも使われます。

**2. ３つのAZに保存されるので信頼性が高い**
RDSは自分でマルチAZを有効する必要がありますが、DynamoDBは常に３つのAZで動作するため信頼性が高いです。

**3. 読み書きや容量などのスケーリングが自在**
要件に応じて、テーブルごとに１秒あたりの読み書きの回数を指定することができます。また予測が難しい場合にはオンデマンドに使用することもできます。ストレージに容量制限はありません。

### DynamoDBの用語
**パーティションキー**
書き込まれたデータをどのパーティションに保存されるかを決めるためのキーです。複数のパーティションが存在する場合は、1つに書きこみが集中してしまわないように設計を行います。

**ソートキー**
パーティション内でどの位置に保存するかを決めるためのキーです。同じソートキーを持つデータは、物理的に近い位置に保存されます。

**プライマリキー**
パーティションキー、もしくはパーティションキー　＋　ソートキーのことを指します。　
![スクリーンショット 2022-07-03 23.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/595c3706-f026-3328-002a-13764497ed77.png)

**グローバルセカンダリインデックス**
パーティションキー、ソートキーを組み替えてより効率的に検索を行えるようにする方法です。

**ローカルセカンダリインデックス**
パーティション内でプライマリキーはそのままに、ソートキーを組み替えてより効率的に検索を行えるようにする方法です。
<br>


## DynamoDBを作ってみる
### Partition Keyとしてtimestampを指定する
![スクリーンショット 2022-07-04 0.47.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/2b4ac996-68ed-dafc-b38f-49a554750cce.png)

### テーブル設定を行う
![スクリーンショット 2022-07-04 0.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/c338a807-9a5c-1711-ec7d-8359f06dbe3d.png)

### 手動で入力してみる
![スクリーンショット 2022-07-04 0.50.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/4a200ac6-748f-8211-0d68-e37af65fcb01.png)
![スクリーンショット 2022-07-04 0.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/36fc27ea-f786-acba-b690-f152077de8e3.png)
<br>


## 全部組み合わせてみる（API　Gateway ＋　Lambda ＋　DynamoDB)
#1で作ったものも作っていきます。

https://qiita.com/gazami_shougun/items/c63489b6270b8703b03d#lambda%E3%82%92%E5%8D%98%E4%BD%93%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B


### 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ロール設定を修正する
![スクリーンショット 2022-07-04 1.11.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/e9426e72-4c61-ecb9-f5fd-c09c88d39171.png)

### APIを叩いてみる
テストはうまく行きました。
![スクリーンショット 2022-07-04 1.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/aebdef04-cb73-e86c-6724-64b1330037cc.png)
DynamoDBにもきちんと書き込まれています。
![スクリーンショット 2022-07-04 1.59.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/6f8957ca-0f66-4ab4-0508-0c77c5fbf994.png)

APIからでも翻訳させることができました！！
![スクリーンショット 2022-07-04 2.09.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/9692a000-4283-2bc3-a87a-7f1b94d4989d.png)