GCPのCloud Functions(GCF)を使えば、サーバーレスでLINE Botを作ることができます。しかも無料です。
このエントリでは、GCFを使ってサーバーレスでLINE Botを作る方法を紹介します。
システムはいたってシンプルで、下図のようにLINE Messaging APIからのHTTPリクエスト(webhook)をGCFで受けてreplyするだけです。
サーバーレスと言えばAWS Lambdaもありますが、GCFの良いところは、HTTPリクエストを受けるためのエンドポイントも一緒に付いてくる点です。
Lambdaで同じことをやるにはAPI Gatewayを前に置いてあげる必要があります。
LambdaもGCFも個人利用レベルでは無料になると思いますが、API Gatewayは有料です。*1
サンプルコードをデプロイして実際に動かしてみましょう。
前準備として下記の手順を済ませてください。
下記のサンプルコードを任意のディレクトリにcloneします。
サンプルコードのconfig
ディレクトリにdefault.json
を作成し、下記のようにLINE Messaging APIのChannel Secretとアクセストークンを記載します。
config/default.json
{
"channelAccessToken": "xxxx",
"channelSecret": "xxxx"
}
Channel SecretとアクセストークンはLINE Developers の Consoleからチャネル(Bot) を選んだ先のページに記載されています。
もしまだ発行されていなければ発行しましょう。
index.js
と同じディレクトリで下記デプロイコマンドを実行します。
$ gcloud beta functions deploy webhook --trigger-http --source .
数十秒ほどでデプロイが完了しhttpsTrigger URLが表示されます(下図赤枠)。
このURLをLINE 側コンソールの「Webhook URL」に設定し接続確認します。
✅ 成功しました。と表示されれば完了です。
BotをLINEアプリで友達追加し「ホイちゃん」と話しかけると反応します。
リアクションさせたいキーワードはindex.js
内の下記箇所で指定しています。
今回作成したコードは「LINE Bot SDK / Node.js」) のecho-botサンプルがベースになっています。
今回作成したプログラムをGCFで動かす際に、注意すべき点が2つあります。
LINE Messaging APIでは、リクエストがLINEプラットフォームから送信されたことを確認する必要があります。署名の検証です。
echo-botサンプルではExpressが使われており、署名はリクエストハンドラの最初のチェインmiddleware()
内で検証されています。
app.post('/callback', line.middleware(config), (req, res) => {
middleware()
内で呼ばれる検証メソッドvalidateSignature()
には生のRequest Bodyを渡す必要があります。
if (!validateSignature(body, secret, signature)) {
GCF ではreq.body
は既にパース済みのため、req.rawBody
を引数にして直接validateSignature()
を呼び出さなければなりません。
今回のサンプルプログラムでもそのようにしています。
if (!line.validateSignature(req.rawBody, config.channelSecret, signature)) {
以上です。このエントリでは、GCFを使ってサーバーレスでLINE Botを作る方法を紹介しました。