背景
LINE bot を周知戦略としてビジネスに使うことが増えている.しかし,チーム開発でどうLINE botを開発し運用すべきかという議論はあまり行われていない.ここでは,LINE botのバックエンドにHTTP APIをトリガーにしたLambdaを用いたモダン開発運用のエコシステムを提言する.
概要
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とは
ステージ管理に必要なことが3つある
ここでは開発用にdev,本番用にprodというステージを設ける.devステージにステージ変数としてキーにalias,値にdev
を定める.同様にprodステージにステージ変数としてキーにalias,値にprod
を定める.
統合管理っていう日本語マジで伝わらん(勉強不足).言い換えると「トリガー先のLambda関数を正しく設定しないと,ステージ変数に紐づくlambdaが実行されないのでその管理」という認識を個人的にしている.API Gatewayの統合管理で上の画像のようにlambda関数を{LambdaFunctionName}:${stageVariables.alias}
と設定しておく.ここを正しく設定しないとLambdaが実行されないので注意.編集したAPIは自動デプロイとする.
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
をリリースする気持ちになる例) os.environ[‘CHANNEL_ACCESS_TOKEN’]
に変更
1
を発行1
に紐付ける1
のLambdaトリガーに作成したAPI Gatewayのv1ステージを紐付ける例) {endpoint}/v1/{LambdaFuncName}
例)os.environ[‘DEV_CHANNEL_ACCESS_TOKEN’]
に戻しておく
$latest
にデプロイしている)例) 開発用botのwebhookURLは常に {endpoint}/dev/{LambdaFuncName}
$latest
からv2
をリリースする気持ちになる以下無限ループ
とても手順が多いが以上の事を行う必要がある
まとめ
LINE botのバックエンドに低コストに運用できるHTTP APIをトリガーにしたLambdaを用いて,Lambda内のバージョン管理およびAPIGatewayでのステージ管理を適切に行うことで,サーバレスLINE botの開発から運用へのエコシステムを提言した.