サーバーレスに触れる

# はじめに
APIGateway、Lambda、DynamoDBを使って
簡単なサーバーレスアプリケーションを作成して
サーバレスに触れてみようと思います。
自分用の備忘録として記述しようと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/c91bc177-ba4d-dd2e-acc0-c51ea8e9b578.png)

# 1.DynamoDBを作成
DynamoDBの説明は[こちら](https://www.slideshare.net/shimy_net/amazon-dynamodb-23315068)を参考にしてみて下さい。

## テーブル作成
コンソール画面からDynamoDBの画面に移動します。
そして[テーブル作成]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/53079572-e15b-36ee-0137-9c82951fd497.png)

テーブル名、プライマリキーを入力します。
今回はそれぞれ`test-item`,`item_id`と設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/a4704a53-248b-d708-644d-ed8d5e813366.png)

これで作成ボタンを押すと作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/4cbdc5e9-ada0-5be9-f219-a1f873cd9459.png)


## テーブルの項目を追加
作成したテーブルの項目を追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/7b23c768-1bc8-7b7c-29b4-5df6c8c8a291.png)

初期の状態ではプライマリキーで設定した`item_id`しか入っていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/55a79a83-50e3-ea15-39a2-12d072106442.png)

作成したテーブルにitem_idと紐づくnameを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/73b271bc-9ab6-d488-122b-47588aa84284.png)

`item_id`、`name`の中身を入力して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/65cb5a52-e619-d3a0-6cfd-518a9aa2aaed.png)

項目の中身があることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/a840c1df-391d-ffc4-7704-f49f920db814.png)

同じように二つの項目も追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/41808e90-f2a5-d5a8-db24-b264270de334.png)

# 2.Lambdaの作成
Lambdaについては、[こちら](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)を参照してみて下さい。

## IAMロールの作成
LAmbdaの作成の前にIAMロールを作成します。
IAMロールは、EC2やLambdaなどのAWSリソースに権限を付与するために使用します。

コンソール画面から「IAM」を選択して「ロール」から[ロール作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/ae4ecdb6-28a6-24bf-9eb0-f678e80ef6ce.png)

Lambdaに対するロールを作成するため、Lambdaを選択して
[次のステップ：アクセス権限]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/b73c57e1-db0b-0b92-ad7d-56667cab6797.png)

作成するロールに権限を付与します。以下の二つが対象になります。

- ログの書き込み権限:`AWSLambdaBasicExecutionRole`
- DynamoDBへのアクセス権限:`AmazonDynamoDBFullAccess`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/fa7e594b-d710-bf83-ef57-1b4da1842748.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/4f39c6c1-c1af-4dce-b6a9-97555ecda29d.png)

ポリシーの選択が完了したら[次のステップ]を選択して
ロール名を入力します。
完了したら[ロールの作成]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/42267c58-ae7f-40f3-fcb7-198c56863c80.png)

## Lambdaの作成
コンソール画面から「Lambda」を選択します。
[関数の作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/920e9d68-a134-b7ac-23dc-6c91ca2685f6.png)

「一から作成」を選択したまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/a5f7a53a-2937-473c-0396-2c90b043a1bb.png)

名前、ランタイム、ロールを入力していきます。
関数名は`get-item-test`、ランタイムは`python`、実行ロールは上記で作成したロールを選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/0d4767d9-8c56-b0e0-bb06-68ce9feb19cb.png)

[関数の作成]をクリックすると完成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/848296bb-1cbc-fefd-b422-e87569103be5.png)

## Lambda関数の作成
初期のLambdaではテストが成功すると`Hello from Lambda!`が表示されるような内容になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/11a092f1-64ad-3ce2-faa6-1c8da55f2e71.png)

この関数をDynamoDBから値を取得する関数に変更していきます。

```.py
import boto3
  
dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('test-item')
  
def get_item(id):
    response = table.get_item(
            Key={
                 'item_id': id
            }
        )
    return response['Item']
          
def lambda_handler(event, context):
    item = get_item('001')
    return item
```
`get_item`メソッドでitemの情報を取得しています。

これを保存して[テスト]をクリックします。
そうするとitem_idに関連したnameが取れることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/c4631321-0425-b118-ec78-527eed453a55.png)

# 3.API Gatewayの作成
API Gatewayについては[こちら](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/welcome.html)を参考にしてみて下さい。

## API作成
APIを作成していきます。
API名を記入して[APIの作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/8511c47e-72e8-8d0d-c258-38473acd4c97.png)


## メソッド作成
「アクション」から「メソッドの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/37e5a910-fb06-7eb2-db41-afb3d4aa727b.png)

「GET」を選択してチェックマークをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/3b09cb45-0845-f940-2f4c-d7fca9d2dd7f.png)

Lambda関数に作成したLambda名を記入して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/9ba612d3-2454-036c-8484-a29efd7c1d9a.png)

## テスト
Lambda関数を呼び出すテスト実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/56554e1f-1f1d-6178-16ce-bb60d96819db.png)

[テスト]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/3fe704b8-05c5-b45c-f417-37aa34b538b0.png)

そうすると成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/2fd5fdc7-35de-4471-59ef-cfc29cdf9b7a.png)

## マッピングテンプレート
現在の状況だとLambda実行されたときに、idが001のものが呼び出されます。
これをAPI Gatewayからidを指定して引き渡せるようにしていきます。

「統合リクエスト」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/a2c1dbb3-ffc5-63c2-b79f-6fa781979fa8.png)

マッピングテンプレートを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/720da382-fc99-1005-cebf-098b37a34486.png)

「Content-Type」に`application/json`と記入し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/9930e2b5-579a-72fe-86a4-ca2d04b2941c.png)

テンプレート内容を以下のように記述します。

```.py
"item_id" : "$input.params('item_id')"
```

これで保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/b1241c24-87cd-c5bb-6184-24e7d48bbbd6.png)


## Lambda修正
API Gatewayから`id`を取得して、それに紐づく情報をDynamoDBから取ってくるようにLambdaを修正します。

Lambdaの画面の関数コードか`lambda_handler`メソッドを以下のように修正します。

```.py
def lambda_handler(event, context):
    item = get_item(event['item_id'])
    return item
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/1d3dc75b-62ef-35ae-9b4b-ae079bfbef47.png)

これを保存します。

## APIのデプロイ
最後にAPIのデプロイをしてインターネットのURLから叩けるようにします。

APIの画面の「アクション」から「APIのデプロイ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/653287ca-9258-4b53-6d21-46daa91e8dc7.png)

ステージ名を記入して[デプロイ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/60cb0f94-7b24-44b4-d812-4b48312e87cf.png)

URLが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/0dcb6836-a89c-231e-7b9e-4287405bd8d7.png)

このURLの後ろに`item_id=001`を付けてブラウザから送ってみます。

`https<ステージ名>/test?item_id=001`のようなURLをブラウザで叩くと
画面に以下の内容が表記されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/425236a0-2151-19b4-0f3f-c2aa0a146f1d.png)

試しに`id`を`002`や`003`にするとそれに紐づいた`name`が返ってくると思います。

# まとめ
この[資料](https://dev.classmethod.jp/cloud/aws/serverless-first-dynamodb/)を参考に今回はDynamoDB、API Gateway、Lambdaを使った開発をしてみて一連の流れがなんとなく理解できた。
これからもっとサーバレスへの理解を深めるために様々なサービスに触れてみたいと思っています。