初心者が５分で出来る簡単サーバレスAPIを構築してみる【Lambda】

#はじめに
今回は機械学習ではないのですが、自分がAWSの試験を受けるにあたり、IT初心者としてサーバレスについてイメージが難しいところがありました。
サーバーへの考慮がいらない、サーバーのメンテナンスや管理をしなくていいと言われていますが、実際使い勝手などが分かりにくい。

少しでも理解できるようになるために、1杯のコーヒーよりもコストが低いAPIの作成を実践してみました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/392cf8a3-653b-22c5-2c29-852c89a37012.png)
[AWS Black Belt 公式より抜粋](https://d1.awsstatic.com/webinars/jp/pdf/services/20190814_AWS-Blackbelt_SAM_rev.pdf)


##AWSのサーバレスサービス
サーバレスとは言いますが、サーバが存在していないわけでは無いのです。
あくまでもAWS側がサポートしてくれて、サーバを意識せずに、アプリケーションを作成したり運用できるサービスのことを指しています。

#１. DynamoDB でテーブルを作る
データベースのidの番号から、名前を引っ張ってこれるような簡単なAPIを作っていきます。
まずは、データベースの DynamoDB にテーブルを作成していきます。
![2020-01-10_09h21_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/f29372a7-5ca1-66bb-79a1-233c3ea3a0c2.png)
テーブル名を入力して[デフォルト設定の使用]にチェックマークをつけて作成をクリック。
![2020-01-10_09h23_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/f38d5b8a-41d3-7f65-5191-ee415eb12fe6.png)
数秒待つとテーブルが作成されます。出来上がったテーブルをクリックして、右の[項目]のタブから[項目の作成]をクリック。
![2020-01-10_09h24_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/29987945-c38d-0b21-8444-89fd130a9db4.png)
「id string:」の VALUE の項目にまず１という番号を入力して、＋ボタンをクリックし、[Append]を選択してさらに[String]を選択します。
![2020-01-10_09h30_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/2bbf3c47-7668-7c7a-2664-27816d17be87.png)
FIELD という項目には[name]を入力し、 string の項目には適当な名前を入力します。
![2020-01-10_10h41_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/6a83bc4c-bae1-3d4b-97f0-010fb617a245.png)
同じ手順で三人分名前を登録しました。
![2020-01-14_15h21_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/30b0162f-b374-575d-b1cd-47c477ab13da.png)

#２. Lambda関数を作る
次は Lambda のコンソールへ行き、関数の作成に入ります。
![2020-01-10_10h43_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/c6f76260-18c8-8b1d-b672-b818e15903f9.png)
[一から作成]を選択している状態でまずは関数名を入力。
![2020-01-10_10h45_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/7ee55bae-6fa9-6a9f-8d0b-54522d950987.png)
ランタイムで関数の言語を選択します。今回使うのは[Node.js 10.x] 。
実行ロールの選択または作成を選択し、DynamoDB のアクセス権限をつけます。そして作成をクリック。
![2020-01-10_10h48_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/1a7129c5-960b-8031-6b90-3c9bb37f0922.png)
次に DynamoDB からidの番号で名前を引っ張ってくるシンプルなコードを書いていきます。
![2020-01-10_10h49_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/9bdac59b-8942-723e-f014-6aa6dd013859.png)
コードはこちら。

```Node.js
'use strict';

const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient();
const createResponse = (statusCode, body) => ({ statusCode, body });

    exports.handler = (event, context, callback) => {
    //テーブル名を指定
    let params = {
        TableName: 'test' ,
        Key: {
            id: event.pathParameters.id
        }
    };
    
    let dbGet = (params) => { return dynamo.get(params).promise() };
    
    dbGet(params).then( (data) => {
        if (!data.Item) {
            callback(null,createResponse(404, "ITEM NOT FOUND"));
            return;
        }
        callback(null, createResponse(200, JSON.stringify(data.Item)));
    }).catch( (err) => {
        callback(null, createResponse(500, err));
    });
};
```

index.js のデフォルトのコードを削除して書き直します。右の[保存]をクリックして更新します。
![2020-01-10_16h46_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/aa41aaef-8e33-0f1f-e3ce-b3cbb8b15bd9.png)


#３. API をデプロイする
API　Gateway のコンソールへ行き、API の作成に入ります。
![2020-01-10_17h09_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/9d3f45a8-6a16-d0ee-336b-b4444517edfc.png)
リソースの横にある、アクションのプルダウンから[リソースの作成]を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/3c6717fc-6414-3f44-c4d2-def43fdf364e.png)
リソース名を入力して[リソースの作成]をクリック。
![2020-01-10_17h14_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/ddbd7d13-acdd-a915-3d4a-95d41b6adc2b.png)
作ったリソースにさらに子リソース[id]を追加し、「{}」で囲みます。idの番号で指定できるようにするためです。
![2020-01-10_17h16_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/644d5b0d-1a7d-8393-b814-89a4f576c23b.png)
アクションのプルダウンから、次は[メソッドの作成]を選択します。
![2020-01-10_17h25_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/59403a4c-8201-e425-79fe-9da7830793c8.png)
プルダウンから[GET]を選択したら、横にチェックマークが出るのでクリック。
![2020-01-10_17h27_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/ffdd8734-94fc-85be-cbb1-059365172877.png)
セットアップ画面が出てくるので、先程作った Lambda 関数の名前を入力し紐付けます。
![2020-01-10_17h30_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/13606b71-39b2-6a4f-185a-d143ccb946ae.png)

![2020-01-10_18h02_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/3e2b71c0-ed19-3311-3b0f-78d5c87f65b9.png)
最後にアクションのプルダウンから[APIのデプロイ]を選択します。
![2020-01-14_09h20_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/47977c48-737a-747d-ff80-03a2851d0302.png)
デプロイされるステージは[新しいステージ]を選択。[prod]を入力し[デプロイ]をクリックします。
![2020-01-14_09h22_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/bbdd55e3-1e78-87d0-65d0-fadc80f36b83.png)
出来上がったAPIを確認するために、URLをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/ddb02ca6-16c0-f9b2-76de-070fe7840f21.png)

#４.確認しよう
先程コピーしたURLの最後に、API で作ったリソースを指定します。
今回は「/users/{id}」でしたので、id のところは Dynamo で登録したidの番号を指定します。
（私が登録したのは１か２か３）
Dynamo で登録した「 id : 1 」の「 Jill 」を引き出せました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/6375e2f2-70c0-3141-a12f-b845c0e83344.png)


#所感
APIを形成するには、本来ならもっと細かく、インフラの構築から始めるようなものだと想像してましたが
データベースに登録して、Lambda でコードを書いて、API に紐付けただけで完了できました！
実に簡単で早い！これなら確かに、API やアプリの中身を構築することだけに集中して作業ができそうですね。
環境構築や障害対策のことを考えながら、アプリを運用するのはコストもかかるし、開発だけに集中するのはなかなか難しいところであると思います。
一日のリクエスト数、集中する時間が限られているものであれば、コスト面で最適だと思います。


#公式リンク
[AWS Lambda　開発者ガイド](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)
[参考にしたAWSの公式サミット動画](https://www.youtube.com/watch?v=fs-ByT_I1G0&t=1547s)