はじめに
皆さん、Lambdaをご存知でしょうか?
Lambdaはサーバーレスアーキテクチャを実現する上で根幹となるサービスです。
サーバーレスアーキテクチャとは
AWSにおけるサーバーレスとは、**「インスタンスベースの仮想サーバー(EC2など)を使わずにアプリケーションを開発するアーキテクチャ」**を指します。
一般にシステムの運用には、プログラムを動かすためのサーバーが必要です。
そしてそのサーバーは、常に稼働していなければなりません。
しかし開発者がやりたいことは、「サーバーの管理」なのでしょうか?
エンドユーザーに価値を届けることこそが使命なわけです。
ということで、こういうめんどくさい作業から解放してくれるのがサーバーレスアーキテクチャなわけです。
サーバーレスアーキテクチャでよく使われるサービスは以下の通りです。
特に、丸で囲っている3つがよく使われます。
AWS Lambdaの特徴
サーバーのプロビジョニング/管理なしでプログラムを実行できるサービスです。
**「何言ってんの?」**と思われた方のために要約すると、
「コードの実行などはLambda側でやるから、あなたはコードを書いてなさい」ということです。
そして、Lambdaの圧倒的なメリットは料金の安さです。
リクエストベースの料金体系となっており、
実行回数×実行時間となっています。
リクエスト 100万件あたり 0.20USD
実行時間 GB-秒あたり 0.0000166667USD
これだけ安いのにも関わらず無料枠もあります。
1か月ごとに100万件の無料リクエスト、および40万GB-秒のコンピューティング時間が無料利用枠です。
なので、もはや0円です。
HerokuやNetlifyなど無料でデプロイできる選択肢はたくさんありますが、
これらはレスポンスに時間がかかるなど問題があります。
そういった問題も緩和できるLambdaは初学者の味方です。
しかし対応言語が限られているのが若干のネックです。
Java、Go、PowerShell、Node.js、C#、Python、Rubyなどが対応しています。
有名どころとしては、PHPが対応していないのが残念ですが、カスタムランタイムを実装することで利用可能になります。(少々難易度が上がります)
アプリケーションエンジニアこそぜひ!!
サーバーレスアーキテクチャであれば、EC2と比べ自由度は低くなりますが、管理の手間がほぼありません。
なので、アプリケーションエンジニアのインフラの入口としては最適な題材です。
DynamoDBはRDSに比べるとNoSQLならではの癖があるので、1つ壁があります。(Joinが使えないなど)
テーブル構造など意識して取り組む必要があるのでここだけ難易度があります。
ということで今回は、LambdaとAPI Gatewayの2つのみを使ってオウム返しのBotを作りたいと思います。(デバッグのためにCloutWatchも少しだけ使います。)
アーキテクチャ
LINEで「こんにちは」と入力したら、「こんにちは」と返ってくれば成功です!
ハンズオン
前提
初めてAWSを使う方に対しての注意です。
ルートユーザーで行うのはよろしくないので、全ての権限を与えたAdministratorユーザーを作っておいてください。
公式サイトはこちらです。
文章は辛いよって方は、初学者のハンズオン動画があるのでこちらからどうぞ。
また、LINE Developersのアカウントも必要となります。
LINE関連の記事を書いているのでこちらから確認してください。
チャネルシークレットとチャネルアクセストークンが発行できればOKです。
Lambdaで使うコードを作る
LINE Messaging API SDK for nodejsに書いていることをやっていきます。
こちらがまんまオウム返しなので、これをLambdaで使えるように書き直していきます。
package.jsonの作成
$ npm init -y
パッケージのインストール
$ npm install @line/bot-sdk --save
コードを書いていきます
先に説明すると、exports.handler = async (event, context) => {}内にコードを書いていきます。
ちなみにここで、大切なので**コールドスタートとウォームスタート**についても解説します。
Lambdaは呼び出されると、コンテナ上でプログラムが実行されます。
コンテナは再利用されますが、利用可能なコンテナがないときはコールドスタートとなります。
また、exports.handler外の場合、ウォームスタートとなります。
なので使い回す処理などはウォームスタートにすると早く動作します。
'use strict';
// パッケージのインストール
const line = require('@line/bot-sdk');
// LINEアクセストークンの設定
const config = {
channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
channelSecret: process.env.CHANNEL_SECRET,
};
// インスタンス化
const client = new line.Client(config);
exports.handler = async (event, context) => {
// eventを出力
console.log(event);
// JSONとして解析して値やオブジェクトを構築する
const body = JSON.parse(event.body);
console.log(`【body】: ${JSON.stringify(body)}`);
// LINE Eventを取得
const response = body.events[0];
console.log(`【response】: ${JSON.stringify(response)}`);
// メッセージ送信のために必要な情報
const replyToken = response.replyToken;
const post = {
type: 'text',
text: response.message.text,
};
try {
await client.replyMessage(replyToken, post);
} catch (err) {
console.log(err);
}
};
console.logは、CloudWatch内で確認できるので、デバッグも容易です。
なので、ここでコードの全体像が理解できなくても大丈夫です!
Lambdaを作成する
Lambdaとコンソールで検索してください。
「関数の作成」をクリック
設定を見ていきましょう!
作成完了しました!
では、先ほど作成したコードをLambdaで使えるようにしましょう。
方法は2つあります。
・S3経由
・zip経由
zipの方が簡単なので今回はzipにします。
node_moduleとindex.jsの2つをzipにしてください。
命名は適当でいいです。
ではアップロードしましょう。
コードがLambdaで確認できました!
では次に環境変数の設定を行います。
先ほどLINEで取得した値をこちらで入力します。
これでLambdaは完了です。
API Gatewayの設定
API Gatewayとコンソールで検索してください。
APIタイプはREST APIで作成します。
API名は適当でいいです。
メソッドの作成をしましょう。
POSTを選択して決定。
セットアップを行う。
CORSの設定を行います。
デフォルトのままでOK
最後にデプロイしましょう!
ステージ名も適当でいいです。
このようにURLが発行されます。
ではこのURLをLINEの方に入力しましょう。
完了したらテストです。
結果を見てみましょう。
うまくいってますね!
私はユーロ2020全試合見ているので睡眠時間が最近やばいですw
ちなみにポルトガル推しです。
本題に戻ります。
最後にCloudWatchでデバッグがどうなっているのか見ていきましょう。
このログストリーム内にデバッグの内容が格納されています。
デバッグできてますね!
これで完了です。
ちなみに、LambdaはEC2などと違って、起動時間ではなくリクエストが課金条件なのでわざわざ削除する必要もありません。
最後に
次はDynamoDBを使う構成のアプリを作成していきます。
ちょっとレベルアップしてます。
























