４０代おっさんREST API サーバーレスを学ぶ②

---
## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## 前回

<https://qiita.com/kou1121/items/f3a1a67c3aab6d89dd58>

## Lambda関数

AWS Lambdaを開く

一から作成を選ぶ

![Lambdapost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/14a46127-3bd8-fd09-c882-44cb2bf0b293.png)

関数名を入れる(users-post-function)
ランタイムをpython 3.9

![Lambdaロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/85d8b7fc-1455-7a4f-4927-8c1b837ab718.png)

既存のロールを使用するを選択
先ほど作ったロールを入れる

終わりましたら作成をクリック

### post

`users-post-function`

```python
import boto3 # AWSのリソースを動かす
import json

dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('users')
 
def post_users(requestJSON):
    #  各値を呼び出してセットする
    table.put_item(Item={'id': requestJSON['id'], 'name': requestJSON['name'], 'age': requestJSON['age'], 'address': requestJSON['address'], 'tel': requestJSON['tel']})

def lambda_handler(event, context): # API Gatewayがlambda_handler最初に呼ばれる。
    requestJSON = json.loads(event['body']) # eventを文字列形式からjson形式にする
    post_users(requestJSON)
```

### gat

`users-get-function`

```python
import boto3
 
dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('users')

#リクエストパラメータでIDが指定される場合、該当IDのユーザ情報を取得して返す
def get_user(id):
    response = table.get_item(
            Key={
                 'id': id
            }
        )
    return response['Item']

#リクエストパラメータでIDが指定されない場合、全ユーザ情報を取得して返す
def get_users():
    response = table.scan()
    return response['Items']
         
def lambda_handler(event, context):
    return get_users() if event['id'] == '' else get_user(event['id'])
```

### put

```python
import boto3
import json

dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('users')
 
def post_users(requestJSON):
    table.update_item(
        # 更新のためのキー情報を取得
        Key={
            'id': requestJSON['id']
        },
        # アップデートのSQL文
        UpdateExpression="SET #name = :newName, age = :newAge, address = :newAddress, tel = :newTel",
        ExpressionAttributeNames= {
        '#name' : 'name'
        },
        # 更新対象の値を変数にセット
        ExpressionAttributeValues={
            ':newName': requestJSON['name'],
            ':newAge': requestJSON['age'],
            ':newAddress': requestJSON['address'],
            ':newTel': requestJSON['tel']
        },
    )

def lambda_handler(event, context):
    requestJSON = json.loads(event['body'])
    post_users(requestJSON)
```

nameはAWS上の予約語になっている。
SET文の時は#nameになっている。
その後の
`ExpressionAttributeNames= {
        '#name' : 'name'
        }`
でカラム名はnameであると明示している。

### delete

```python
import boto3
 
dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('users')

#リクエストパラメータでIDが指定される場合、該当IDのレコードを削除する
def delete_user(id):
    table.delete_item(
        Key={
            'id': id
        }
    )

#リクエストパラメータでIDが指定されない場合、テーブルを削除する
def delete_users():
    response = table.delete()
         
def lambda_handler(event, context):
    return delete_users() if event['id'] == '' else delete_user(event['id'])
```

## デプロイ

![deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/974dd333-2dec-0414-11b6-c4d965366897.png)

Deploy（赤丸）をクリック
これをすべての関数で行う。
これでサーバーレス環境にデプロイされたことになる。

## 参考

https://www.udemy.com/course/awsrest-api/