【AWS】API Gateway　→　Lambda　→　DynamoDB　ハンズオン

## 概要
・API Gateway、Lambda、DynamoDBの構築

・API Gateway　→　Lambda　→　DynamoDB間でHTTP通信のテスト（テーブル作成）

## 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/f2220265-11a3-4204-a6a6-e66a50d7db10.png)

## ハンズオン参考資料

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-apigateway-tutorial.html#services-apigateway-tutorial-prereqs

## 作業手順
1. IAMポリシーの作成(Lambda用)
2. IAMロールの作成(Lambda用)
3. Lambda関数作成
4. API　Gatewayの作成（REST）
5. DynamoDBの作成
6. API Gatewayからテーブル作成のテスト実行

## IAMポリシーの作成(Lambda用)
・ハンズオン資料の「許可ポリシーを作成する」を参照
　下記のカスタムポリシーを使用（DynamoDB及びCloudWatchLogへの許可権限）
```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1428341300017",
      "Action": [
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Sid": "",
      "Resource": "*",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow"
    }
  ]
}
```
作成したIAMポリシー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/4c83361e-b5e2-4d63-bf38-15dd3576bc60.png)


## IAMロールの作成(Lambda用)
・ハンズオン資料の「実行ロールを作成する」を参照
作成したIAMロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/7269adde-062a-44a9-96d5-4d75b61f00d6.png)


## Lambda関数作成
・ハンズオン資料の「関数を作成する」を参照
作成したLambda関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/836702e1-c040-4f8e-a3a9-13c6a9cf040f.png)

Pythonコードには、こちらを張り付ける。
```
import boto3

# Define the DynamoDB table that Lambda will connect to
table_name = "lambda-apigateway"

# Create the DynamoDB resource
dynamo = boto3.resource('dynamodb').Table(table_name)

# Define some functions to perform the CRUD operations
def create(payload):
    return dynamo.put_item(Item=payload['Item'])

def read(payload):
    return dynamo.get_item(Key=payload['Key'])

def update(payload):
    return dynamo.update_item(**{k: payload[k] for k in ['Key', 'UpdateExpression', 
    'ExpressionAttributeNames', 'ExpressionAttributeValues'] if k in payload})

def delete(payload):
    return dynamo.delete_item(Key=payload['Key'])

def echo(payload):
    return payload

operations = {
    'create': create,
    'read': read,
    'update': update,
    'delete': delete,
    'echo': echo,
}

def lambda_handler(event, context):
    '''Provide an event that contains the following keys:
      - operation: one of the operations in the operations dict below
      - payload: a JSON object containing parameters to pass to the 
        operation being performed
    '''
    
    operation = event['operation']
    payload = event['payload']
    
    if operation in operations:
        return operations[operation](payload)
        
    else:
        raise ValueError(f'Unrecognized operation "{operation}"')
```


## API　Gatewayの作成（REST）
・ハンズオン資料の「API Gateway を使用して REST API を作成する」を参照
作成したAPI Gateway(API名：DynamoDBOperations、リソース名：DynamoDBManager、メソッド：HTTP POST)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/059e8433-e0fc-4b06-9e6e-aed405fcd6c9.png)

## DynamoDBの作成
・ハンズオン資料の「DynamoDB テーブルを作成する」を参照
作成したDynamoDBテーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/b3871a95-6267-4430-bda6-6d2300ba269d.png)


## API Gatewayからテーブル作成のテスト実行
・ハンズオン資料の「API Gateway、Lambda、および DynamoDB の統合をテストする」を参照
API Gatewayの画面からテストコードを入力(create)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/80f3cdc3-6123-49b7-8b18-b8a23161c50e.png)

テスト実行、ステータスコード200（正常）を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/cdbb62d6-a370-460e-9fab-ae3a6f8515fd.png)

DynamoDB画面にて、テーブル項目が作成されているか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/6d9e6d2d-266d-4e38-90d2-0b6fa5898671.png)

API Gatewayの画面からテストコードを入力（update）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/574f1092-1cf4-4544-bdc9-e88146718032.png)

テスト実行、ステータスコード200（正常）を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/15473095-93d2-45f9-aecb-4036792fba1e.png)

DynamoDB画面にて、テーブル項目が更新されているか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/f66f20d6-dac4-4487-ae16-3e4bc9428cf5.png)


## 最後に
API Gateway　→　Lambda　→　DynamoDB　ハンズオンを実施しましたが、手を動かすことで、理解度を深めることが出来ました。（0→1にすることが重要！）
今回のハンズオンの参考として、CloudTech内のレッスン動画を複数回見て勉強しました。とても素晴らしい教材なので皆さんも是非ご活用ください。
下記にリンクを貼っておきます。

https://kws-cloud-tech.com/