【鉄則】サーバレスLINEbotの実運用法が確立した【論文調】

背景

LINE bot を周知戦略としてビジネスに使うことが増えている.しかし,チーム開発でどうLINE botを開発し運用すべきかという議論はあまり行われていない.ここでは,LINE botのバックエンドにHTTP APIをトリガーにしたLambdaを用いたモダン開発運用のエコシステムを提言する.

概要

サーバレスLINE botの運用図

LINEbotのチーム開発運用の鉄則としてこれらを提言した.

  • 開発botと本番botに分ける
  • APIとLambdaでステージ管理を行い,それぞれのbotに紐付ける
  • Lambdaのコードはdocker環境にてローカルで開発する(以下のメリットがある)
    • gitHub管理下に置け,チーム開発に適する
    • Lambdaのコードをいつでもデプロイできる

開発botと本番botに分ける

LINE botのwebhookURLは単一のものしか指定できない.一つのLINEbotが開発用と本番用を兼ね備えてしまうと,メンテナンスのリスクが大きい.本番用でバグ修正を行うようなことがあってはならない.

したがって,LINE botは開発用本番用に分け,それぞれのwebhookURLを以下のようにしておくのが良い

{endpoint}/dev/{LambdaFuncName}
{endpoint}/v1/{LambdaFuncName}
{endpoint}/v2/{LambdaFuncName}
{endpoint}/v3/{LambdaFuncName}

CHANNEL_ACCESS_TOKENやCHANNEL_SECRETがbot毎に異なることに今後は留意すべきこととなる.

APIとLambdaでステージ管理を行い,それぞれのbotに紐付ける

Lambdaではバージョン管理ができる.ちなみにステージ管理と同義と思ってもらって良い.デフォルトで$LATESTというバージョンが用意されていて,これは随時更新されるもの.これを開発用に充てる.

そこに本番リリースバージョンを新たに定義でき,自動で1といったバージョンが振られる.そして,そのバージョンの参照となるエイリアス,例えばv1といったもの定義する必要がある.

つまり

{endpoint}/dev/{LambdaFuncName} => エイリアスdev => バージョン$LATESTが実行
{endpoint}/v1/{LambdaFuncName} => エイリアスv1 => バージョン1が実行される

という流れだ.

したがって,API Gatewayでも作成したAPIでステージ管理をしないといけない

HTTP API のステージ管理

API Gateway でLINE bot用に一般的に使われるAPIは大きく分けてHTTP APIとREST APIがある.前者は後者と比べて低コスト低レイテンシーな運用ができるが,AWSが新規でリリースした技術であるためHTTP APIに関する記事が少ない.本記事ではこのHTTP APIでステージ管理を行う方法について述べていく.HTTP APIとは

HTTP API

ステージ管理に必要なことが3つある

ステージ作成とステージ変数を作成

ここでは開発用にdev,本番用にprodというステージを設ける.devステージにステージ変数としてキーにalias,値にdevを定める.同様にprodステージにステージ変数としてキーにalias,値にprodを定める.

APIで統合管理を正しく設定する

統合管理っていう日本語マジで伝わらん(勉強不足).言い換えると「トリガー先のLambda関数を正しく設定しないと,ステージ変数に紐づくlambdaが実行されないのでその管理」という認識を個人的にしている.API Gatewayの統合管理で上の画像のようにlambda関数を{LambdaFunctionName}:${stageVariables.alias}と設定しておく.ここを正しく設定しないとLambdaが実行されないので注意.編集したAPIは自動デプロイとする.

Lambdaバージョンごとに作成したデプロイステージをトリガーとして設定する

Lambdaのトリガーをバージョン毎に適切に設定する.

Lambdaのコードはdocker環境にてローカルで開発する

LambdaのコードをgitHubで管理することはチーム開発で必須である.直接AWS上でlambdaを編集する人は令和に入って消滅したらしい.念の為,Lambdaのdocker開発用のリポジトリを載せておく.

Python3.7でap-northeast-1リージョンという環境でdockerイメージを構築しているので,適宜自分が求める環境でdockerイメージを作成し直すと良い.この環境で良ければ,デプロイ先のLambda関数をdeploy.shに記述して,$ sh deploy.shで一瞬でデプロイされる.

(使用時はdockerやAWS CLIの一定の理解をしてから使うこと)

開発からリリースまでのパイプライン

以上を踏まえて実際に開発からリリースまでの手順を追ってみる.本当に出来るのだろうか?

開発中(随時$latestにデプロイしている)

例) 開発用botのwebhookURLは常に {endpoint}/dev/{LambdaFuncName}

開発が終了し,$latestからバージョン1をリリースする気持ちになる

lambdaコード内で開発用の環境変数から本番用のそれに差し替える

例) os.environ[‘CHANNEL_ACCESS_TOKEN’]に変更

Lambdaで新しいバージョン1を発行

エイリアスv1を発行し,バージョン1に紐付ける

API Gatewayでv1ステージを作成しデプロイしておく

バージョン1のLambdaトリガーに作成したAPI Gatewayのv1ステージを紐付ける

本番用LINEbotのwebhookURLをv1用に設定する

例) {endpoint}/v1/{LambdaFuncName}

Cloudwatchでv1に関するログが流れるか確認

開発に戻る時はlambdaコード内で開発用の環境変数に戻しておく

例)os.environ[‘DEV_CHANNEL_ACCESS_TOKEN’]に戻しておく

開発中(随時$latestにデプロイしている)

例) 開発用botのwebhookURLは常に {endpoint}/dev/{LambdaFuncName}

開発が終了し,$latestからv2をリリースする気持ちになる

以下無限ループ

とても手順が多いが以上の事を行う必要がある

まとめ

LINE botのバックエンドに低コストに運用できるHTTP APIをトリガーにしたLambdaを用いて,Lambda内のバージョン管理およびAPIGatewayでのステージ管理を適切に行うことで,サーバレスLINE botの開発から運用へのエコシステムを提言した.

この記事を書いた人

正田 孝平

メーカー勤務 ソフトウェアエンジニア
AI,IoT,web最新技術の活用術、キャッシュレス決済と資産運用の最新トレンドや語学学習法について発信。大学在学中は人力飛行機の製作、webアプリ開発に積極的に携わった。
【趣味】
ゴルフ・温泉巡り