AWSのサーバレスサービス試してみた (Lambda・DynamoDB・APIGateway)

AWSの花形と言えばサーバレスのサービスだろうと思ったので
awsのサーバレスサービス(Lamda)を中心に簡単な設計概念を解説してから
lamdaのハンズオン出来るように記事として書き起こしてみる。


###参照：これだけでOK:awsアソシエイト
https://www.udemy.com/course/aws-associate/learn/lecture/13595998


##このハンズオンで実施する内容
1.Lambdaと連携するDynamoDBの構築
2.Lambdaの構築
3.API GatewayによりAPIを構築する


##今回構築するアーキテクチャ
apiを介してlambdaを呼び出して、lambdaがdynamodbからデータを取得するという関数を実行してその関数の実行結果に基づいてapiにdynamodbの取得した結果がapi側で取得されるという流れを作る。
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/faa7be8c-9a96-6324-05e3-d8a1e25da1a4.jpeg)



---------------------------------------------------------------
##1.Lambdaと連携するDynamoDBの構築手順

・awsマネジメントコンソールからdynamodbにアクセス

・テーブルの作成をクリック
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/020661c8-bb32-f480-e75a-451b7445fc4b.jpeg)

・テーブルの作成
-テーブル名:lambda
-キー：id
![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/e7cab32e-7698-b002-0109-04bb76e45206.jpeg)


・以下のようなテーブルを作成
-id:1001
-name:hideki
-department:it


---------------------------------------------------------------

##2.Lambdaの構築


・awsマネジメントコンソールからlambdaにアクセス
-ダッシュボード：ラムダ関数のモニタリングに使用
-アプリケーション：サーバレスアプリの作成
-関数：ラムダの本体
-ラムダの共通部分をレイヤーとして作れる。

・関数の作成をクリック
![WS000009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/35645889-a7a1-4abf-f450-0656afb20cf3.jpeg)

![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/4f1d3450-49ec-d7f2-5089-101d4320bac2.jpeg)

###関数の作成
-関数の作成：一から作成
-関数名：FastLambda
-ランタイム：python3.6を使用
-アクセス権限：
 -基本的なlambdaアクセス権限で新しいロール作成
 -ロール名：LambdaRole
 -ポリシーテンプレート：シンプルなマイクロサービスアクセス権限
 
→作成をクリック（lambda関数が作成される）


###関数の更新

・タグを以下のように追加
 -キー：name
 -値：MyLambdaforDynamoDB

・ネットワーク：
 -VPCを選択する。

・以下の関数コードを貼り付ける


```lambda.py
# AWSをPythonで利用するためのSDK boto3をインポートする
import boto3

from boto3.dynamodb.conditions import Key, Attr
 
# Functionの実行ログを出力
print('Loading function')
 
# DynamoDBと接続
dynamodb = boto3.resource('dynamodb')
 
# テーブル内のIDを指定してデータを該当するitemを取得する
def lambda_handler(event, context):
    table_name = "DynamoforLambda"
    partition_key = {"id": event["id"]}
    dynamotable = dynamodb.Table(table_name)
    res = dynamotable.get_item(Key=partition_key)
    item = res["Item"]
    
    return item
```


###lanbdaテスト関数の設定手順

・テストボタンをクリック

・テスト関数の貼り付け
![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99495/792e01f5-6e2e-aa31-b499-2930c8e68637.jpeg)


```
#テスト用の設定
{
  "id": "1001"
}
```

イベント名：MyEventに設定

###再度、関数コードの画面に戻り、テストをクリックすると、コードのテスト結果が表示される。


---------------------------------------------------------------

##3.API GatewayによりAPIを構築する

・lambdaの画面から左の「トリガーの追加」をクリック


###トリガーを選択
-API Gatewayを選択

テンプレートの選択
-Rest APIをクリック


追加をクリック

---------------------------------------------------------------

・awsマネジメントコンソールからAPI Gatewayにアクセス

・リソースからANYメソッドを削除

・GETリソースを追加

###GETメソッド
-統合タイプ：lambda関数
-lambda関数：FastLambda


（これでgetメソッドを使ったlambda関数を呼べるようになる）



・統合リクエストをクリック

→マッピングテンプレートの追加
「application/json」と入力
テンプレートの生成に以下のコードを貼り付け保存

```
#API用の設定
{
    "id" : "$input.params('id')"
}
```


###lambda関数のテスト：

・テストをクリック
・クエリ文字列に「id=1001」を入力し「テスト」をクリック


###APIのデプロイ：



###APIを使ったlambdaとdynamoDBのテスト：

・作られたAPIのエンドポイントををコピーする。

・エンドポイントに「?id=1001」を追加し、貼り付ける

→dynamoDBのデータを取得することが出来る。