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

はじめに

今回は機械学習ではないのですが、自分がAWSの試験を受けるにあたり、IT初心者としてサーバレスについてイメージが難しいところがありました。

サーバーへの考慮がいらない、サーバーのメンテナンスや管理をしなくていいと言われていますが、実際使い勝手などが分かりにくい。

サーバーへの考慮がいらない、サーバーのメンテナンスや管理をしなくていいと言われていますが、実際使い勝手などが分かりにくい。

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

image.png
AWS Black Belt 公式より抜粋

AWSのサーバレスサービス

サーバレスとは言いますが、サーバが存在していないわけでは無いのです。

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

1. DynamoDB でテーブルを作る

データベースのidの番号から、名前を引っ張ってこれるような簡単なAPIを作っていきます。

まずは、データベースの DynamoDB にテーブルを作成していきます。

2020-01-10_09h21_19.png
テーブル名を入力して[デフォルト設定の使用]にチェックマークをつけて作成をクリック。

テーブル名を入力して[デフォルト設定の使用]にチェックマークをつけて作成をクリック。

2020-01-10_09h23_00.png
数秒待つとテーブルが作成されます。出来上がったテーブルをクリックして、右の[項目]のタブから[項目の作成]をクリック。

数秒待つとテーブルが作成されます。出来上がったテーブルをクリックして、右の[項目]のタブから[項目の作成]をクリック。

2020-01-10_09h24_57.png

「id string:」の VALUE の項目にまず1という番号を入力して、+ボタンをクリックし、[Append]を選択してさらに[String]を選択します。

2020-01-10_09h30_30.png

FIELD という項目には[name]を入力し、 string の項目には適当な名前を入力します。

2020-01-10_10h41_06.png

同じ手順で三人分名前を登録しました。

2020-01-14_15h21_14.png

2. Lambda関数を作る

次は Lambda のコンソールへ行き、関数の作成に入ります。

2020-01-10_10h43_01.png
[一から作成]を選択している状態でまずは関数名を入力。

[一から作成]を選択している状態でまずは関数名を入力。

2020-01-10_10h45_58.png
ランタイムで関数の言語を選択します。今回使うのは[Node.js 10.x] 。実行ロールの選択または作成を選択し、DynamoDB のアクセス権限をつけます。そして作成をクリック。

ランタイムで関数の言語を選択します。今回使うのは[Node.js 10.x] 。

実行ロールの選択または作成を選択し、DynamoDB のアクセス権限をつけます。そして作成をクリック。

2020-01-10_10h48_47.png

次に DynamoDB からidの番号で名前を引っ張ってくるシンプルなコードを書いていきます。

2020-01-10_10h49_26.png
コードはこちら。
1Node.js2 'use strict';3 const AWS = require('aws-sdk');4 const dynamo = new AWS.DynamoDB.DocumentClient();5 const createResponse = (statusCode, body) => ({ statusCode, body });6 7 exports.handler = (event, context, callback) => {8#テーブル名を指定9    let params = {10        TableName: 'test' ,11        Key: {12            id: event.pathParameters.id13        }14    };1516    let dbGet = (params) => { return dynamo.get(params).promise() };1718    dbGet(params).then( (data) => {19        if (!data.Item) {20            callback(null,createResponse(404, "ITEM NOT FOUND"));21            return;22        }23        callback(null, createResponse(200, JSON.stringify(data.Item)));24    }).catch( (err) => {25        callback(null, createResponse(500, err));26    });27};

index.js のデフォルトのコードを削除して書き直します。右の[保存]をクリックして更新します。

2020-01-10_16h46_21.png

3. API をデプロイする

API Gateway のコンソールへ行き、API の作成に入ります。

2020-01-10_17h09_16.png
リソースの横にある、アクションのプルダウンから[リソースの作成]を選択。

リソースの横にある、アクションのプルダウンから[リソースの作成]を選択。

image.png
リソース名を入力して[リソースの作成]をクリック。

リソース名を入力して[リソースの作成]をクリック。

2020-01-10_17h14_36.png

作ったリソースにさらに子リソース[id]を追加し、「{}」で囲みます。idの番号で指定できるようにするためです。

2020-01-10_17h16_53.png

アクションのプルダウンから、次は[メソッドの作成]を選択します。

2020-01-10_17h25_17.png
プルダウンから[GET]を選択したら、横にチェックマークが出るのでクリック。

プルダウンから[GET]を選択したら、横にチェックマークが出るのでクリック。

2020-01-10_17h27_46.png

セットアップ画面が出てくるので、先程作った Lambda 関数の名前を入力し紐付けます。

2020-01-10_17h30_01.png
2020-01-10_18h02_17.png

最後にアクションのプルダウンから[APIのデプロイ]を選択します。

2020-01-14_09h20_06.png

デプロイされるステージは[新しいステージ]を選択。[prod]を入力し[デプロイ]をクリックします。

2020-01-14_09h22_13.png

出来上がったAPIを確認するために、URLをコピーしておきます。

image.png

4.確認しよう

先程コピーしたURLの最後に、API で作ったリソースを指定します。

今回は「/users/{id}」でしたので、id のところは Dynamo で登録したidの番号を指定します。

(私が登録したのは1か2か3)

Dynamo で登録した「 id : 1 」の「 Jill 」を引き出せました!

image.png

所感

APIを形成するには、本来ならもっと細かく、インフラの構築から始めるようなものだと想像してましたが

データベースに登録して、Lambda でコードを書いて、API に紐付けただけで完了できました!

実に簡単で早い!これなら確かに、API やアプリの中身を構築することだけに集中して作業ができそうですね。

環境構築や障害対策のことを考えながら、アプリを運用するのはコストもかかるし、開発だけに集中するのはなかなか難しいところであると思います。

一日のリクエスト数、集中する時間が限られているものであれば、コスト面で最適だと思います。

公式リンク

AWS Lambda 開発者ガイド

参考にしたAWSの公式サミット動画

この記事を書いた人

aws-recipe-user