はじめに
久しぶりにLINE Bot記事を書いてみようと思います。今回はre:invent2020で発表されたAWS Protonが気になったので試しにLINE Botを作って試してみようと思いました。
とりあえずLINE Botの内容にこだわるつもりはないので簡単なオウム返しBotを作ります。
AWS Protonとは
詳細は公式のドキュメントを見てもらう方が良いかと思います。今の所、あまりドキュメントが充実していないので機能全体を把握していないというのが本音のところですが、雰囲気としてはコンテナ・サーバーレスのためのCI/CDツールといった感じかと思います。
中身としてはCloudFormation、CodePipelineなどのサービスを使っているようです。インフラのプロビジョニングとアプリケーションのデプロイの管理をするためのコンソールがAWS Protonというのが個人的な印象でした。
とりあえず使ってみる
一応公式のGet Startがありますが一部不親切なところもあります。ある程度AWSを触っている人向けに書いている感じですかね。。。
まずはProtonのコンソールから使用を開始する
を押して公式のガイドに従う方がわかりやすいかと思います。
後は↓の1~3の手順も進めてしまいます。
このテンプレート
がAWS上でサーバーレスアプリを構築するためのインフラをとなるようです。Protonのドキュメントではプラットフォームチーム
が担当する箇所ですね。ここをCloudFormationをつかってテンプレートファイルを記述するみたいですが今回はサンプルテンプレートを使います。
Use one of our sample template bundles
を選択するとfargate
かlambda
のテンプレートが選択できるようになります。環境テンプレートはlambda-environment
、サービステンプレートはlambda-service
を選びました。
これらのサンプルテンプレートはここで公開されているみたいです。このLambda用のテンプレートはCRUDのサービスを実装するためのものらしいので、DynamoDBなど今回使う予定のないものも入っていますが別に使わなければ課金の問題はないはずなので無視することにします。LINE Botを作る場合はPOSTリクエストでLambdaが呼び出さればいいので今回はこれで良い気がします。
次がロールの作成ですが、試験用であればNew service role
を選んで適当な名前でそのまま新しいIAMロールを作成してしまえばOKです。
あとはリポジトリ接続
ですが、リポジトリ接続を追加
をクリックするとデベロッパー用ツール
のページが別タブで開かれるのでそこで自分のGitHubなどとアカウント連携しておきます。
最後に環境の作成ですが、これは先程作成した環境テンプレートを選んで適当な名前を設定すれば後はデフォルトの設定で問題ないです。
サービスを作成する
前項はほぼGet Startと同じ内容ですが、ここからオウム返しBotをデプロイするためのサービスを作成します。とりあえずこちらでリポジトリを作成しました。アプリケーションはかなり簡素です。
const line = require('@line/bot-sdk')
const client = new line.Client({ channelAccessToken: process.env.ACCESSTOKEN })
exports.handler = function (event, context) {
let body = JSON.parse(event.body)
let text = body.events[0].message.text
const message = {
'type': 'text',
'text': text
}
client.replyMessage(body.events[0].replyToken, message)
.then((response) => {
let lambdaResponse = {
statusCode: 200,
headers: { "X-Line-Status": "OK" },
body: '{"result":"completed"}'
}
context.succeed(lambdaResponse)
}).catch((err) => console.log(err))
}
サービスのサンプルテンプレートを見る感じ、CodePipelineでのビルド時にコードと依存関係をzipでまとめているような処理をしていたのでそれにあわせてpackage.json
をこんな感じで記述しました。
{
"name": "echolalia-bot",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"publish": "npm install && zip -r function.zip node_modules index.js"
},
"author": "ufoo68",
"license": "MIT",
"dependencies": {
"@line/bot-sdk": "^7.1.0"
}
}
あとはサービステンプレートをもとにサービスを作成してデプロイを実行します。このあたりもGet Startの内容を参考にすると良いと思います。ポジトリの選択については公式ドキュメントでは簡素な説明で記述されているのですが、リポジトリID
はユーザー名/リポジトリ名
の形式で書く必要があります。
次にサービスのカスタム設定を構成ですが、クラスターのRuntimeはNode.jsを選択するようにします。あとはPipeline packaging command
はnpm run publish
と
とりあえずこれでCodePipelineが作成されてLambdaにアプリケーションがデプロイされます。
結果
LINE Botのチャンネル作成の手順は今回は省略します。一応こんな風にちゃんとオウム返しをしてくれるBotが作れました。
さいごに
とりあえずProtonが気になっていたので使ってみました。ただ今回はCRUD用のサンプルテンプレートを使ってアプリケーションの実装をサンプルの内容に合わせたので色々と手心を加えた形になってしまいました(ハンドラや環境変数の指定は直接Lambdaのコンソールでやりました)。
時間があればLINE Bot用の環境・サービステンプレートを独自に作ってやってみても良いかもですね。