API Gateway + Lambda + DynamoDB

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c72f1c64-a021-4af6-d8e9-3cdb7846d3b5.png)

利用するサービス
・DynamoDB
・IAM
・Lambda
・API Gateway


---
###1.DynamoDB でテーブルを作成する###

DynamoDB を開き、「テーブル」から「テーブルの作成」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/192c0666-eed6-6bef-130c-67d5950602f0.png)

[テーブル名]に 「demo_test」 、[プライマリキー]に「test_id」と入力し、「作成」。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/8ca241ab-24d6-224a-6fe3-57c1b4d5ebc1.png)

「項目」から「項目の作成」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/fa14e56d-bfb6-0af7-2bb0-ca720434930c.png)

「Append」から「String」を追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/7a89c4ff-ec12-a4a2-c2e9-07b0a5a65f67.png)

「name」を追加し、以下のように入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/16ccd207-b0d9-3084-ab22-ad83a2b95d42.png)

同様に以下のテーブルになるように作成してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/5986d4c7-6a7f-b2b2-1173-9e2d1025e62b.png)


###2.Lambda関数を作成する###

2つの権限をもつ、IAMロールを作成しておきましょう。
　AWSLambdaBasicExecutionRole：ログの書き込み権限
　DynamoDBAmazonDynamoDBFullAccess：DynamoDBへのアクセス権限

Lambda を開き、「関数の作成」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/533ba852-b8fc-fc89-117d-d8a5d00e71dd.png)

「一から作成」を選択し以下のとおり入力し、「関数の作成」
・名前：demo-lambda
・ランタイム：Python 3.6
・ロール：既存のロール
・既存のロール：作成済みのIAMロールを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/a117d58c-b5b1-3907-a155-f894b23e3daf.png)

コードを以下のように編集する。

```Python:
import boto3
  
dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('demo_test')
  
def get_person(id):
    response = table.get_item(
            Key={
                 'test_id': id
            }
        )
    return response['Item']
          
def lambda_handler(event, context):
    person = get_person('001')
    return person
```

table　は　dynamodbで作成した　table名。
Key　は　プライマリキー。

「テスト」する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/37210628-7e44-1a28-0cb0-0623788ba8e6.png)


###3.API Gatewayを作成する###

test_id　を指定したらその値が返ってくるようにします。

API Gateway を開き、[API 名] に「demo-api」などと入力し、「APIの作成」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/691d7d6a-61ad-4e6b-cfaa-68e80004e672.png)

「アクション」から「メゾットの作成」。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/3cdd33c4-4467-d944-6d98-ff774c5c99fb.png)

「GET」を選択し、[統合タイプ]はLambda、[Lambda 関数]に作成したものを選択し、「保存」。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/478a4735-b4b6-7396-e51c-f69c53ddadd2.png)

「テスト」を実行。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/d3736f6b-2702-c968-df8b-e189ee8372cd.png)

Lambda関数が実行されperson情報がレスポンスとして返却されていることが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/b27275ec-6c25-61de-e39d-6a6eeb020199.png)

作成したLambda関数では、現状、Lambdaを実行時にはレスポンスとして常に test_id:001 を返すようになっています。
ということで、まずAPI　Gateway側からLambdaに変数を引き渡す設定を追加します。
「統合リクエスト」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/82193a64-7066-e673-51f1-857d9dd50cdc.png)

「マッピングテンプレートの追加」をクリックし、「application/json」と追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/88e0f223-d609-b82b-733b-f1c3f86c9569.png)

テンプレートの以下の内容を入力し、「保存」

```
{
    "test_id" : "$input.params('test_id')"
}
```

Lambda も以下の通り修正する。

```Python:
import boto3
  
dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('demo_test')
  
def get_person(id):
    response = table.get_item(
            Key={
                 'test_id': id
            }
        )
    return response['Item']
          
def lambda_handler(event, context):
    person = get_person(event['test_id'])
    return person
```

APIをインターネットに公開します。
「アクション」より「APIのデプロイ」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/50202aa2-a59b-ecf5-00a7-27d6c4b49f9e.png)

適当な[ステージ名]を入力し、「デプロイ」。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/89684b8b-21d9-6872-c74b-b6485abb0bb9.png)

https://mdqzdp29vb.execute-api.ap-northeast-1.amazonaws.com/demo?test_id=001
のように、test_idを入力すると、
{"name": "yamada", "test_id": "001"}
と結果が返ってくるようになります。

test_idを指定しないとエラーになる。
なので、
test_idの指定がなかったら全を返すように、Lambdaを編集してみる。

```Python:
import boto3
  
dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('demo_test')
  
def get_person(id):
    response = table.get_item(
            Key={
                 'test_id': id
            }
        )
    return response['Item']
 
def get_persons():
    response = table.scan()
    return response['Items']
     
def lambda_handler(event, context):
    return get_persons() if event['test_id'] == '' else get_person(event['test_id'])
```

test_idの指定がない場合は、以下のとおりに返ってくる。
[{"name": "yamada", "test_id": "001"}, {"name": "suzuki", "test_id": "003"}, {"name": "tanaka", "test_id": "002"}]