LoginSignup
4
1

More than 3 years have passed since last update.

AWS ProtonでLINE Botを作成してみる

Posted at

はじめに

久しぶりにLINE Bot記事を書いてみようと思います。今回はre:invent2020で発表されたAWS Protonが気になったので試しにLINE Botを作って試してみようと思いました。
とりあえずLINE Botの内容にこだわるつもりはないので簡単なオウム返しBotを作ります。

AWS Protonとは

詳細は公式のドキュメントを見てもらう方が良いかと思います。今の所、あまりドキュメントが充実していないので機能全体を把握していないというのが本音のところですが、雰囲気としてはコンテナ・サーバーレスのためのCI/CDツールといった感じかと思います。
中身としてはCloudFormationCodePipelineなどのサービスを使っているようです。インフラのプロビジョニングとアプリケーションのデプロイの管理をするためのコンソールがAWS Protonというのが個人的な印象でした。

とりあえず使ってみる

一応公式のGet Startがありますが一部不親切なところもあります。ある程度AWSを触っている人向けに書いている感じですかね。。。

まずはProtonのコンソールから使用を開始するを押して公式のガイドに従う方がわかりやすいかと思います。

sc1.png

後は↓の1~3の手順も進めてしまいます。

sc2.png

このテンプレートがAWS上でサーバーレスアプリを構築するためのインフラをとなるようです。Protonのドキュメントではプラットフォームチームが担当する箇所ですね。ここをCloudFormationをつかってテンプレートファイルを記述するみたいですが今回はサンプルテンプレートを使います。
Use one of our sample template bundlesを選択するとfargatelambdaのテンプレートが選択できるようになります。環境テンプレートはlambda-environment、サービステンプレートはlambda-serviceを選びました。

sc3.png

sc4.png

これらのサンプルテンプレートはここで公開されているみたいです。このLambda用のテンプレートはCRUDのサービスを実装するためのものらしいので、DynamoDBなど今回使う予定のないものも入っていますが別に使わなければ課金の問題はないはずなので無視することにします。LINE Botを作る場合はPOSTリクエストでLambdaが呼び出さればいいので今回はこれで良い気がします。

次がロールの作成ですが、試験用であればNew service roleを選んで適当な名前でそのまま新しいIAMロールを作成してしまえばOKです。

sc5.png

あとはリポジトリ接続ですが、リポジトリ接続を追加をクリックするとデベロッパー用ツールのページが別タブで開かれるのでそこで自分の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ユーザー名/リポジトリ名の形式で書く必要があります。

sc6.png

次にサービスのカスタム設定を構成ですが、クラスターのRuntimeはNode.jsを選択するようにします。あとはPipeline packaging commandnpm run publish

sc8.png

とりあえずこれでCodePipelineが作成されてLambdaにアプリケーションがデプロイされます。

結果

LINE Botのチャンネル作成の手順は今回は省略します。一応こんな風にちゃんとオウム返しをしてくれるBotが作れました。

20201213_001406.png

さいごに

とりあえずProtonが気になっていたので使ってみました。ただ今回はCRUD用のサンプルテンプレートを使ってアプリケーションの実装をサンプルの内容に合わせたので色々と手心を加えた形になってしまいました(ハンドラや環境変数の指定は直接Lambdaのコンソールでやりました)。
時間があればLINE Bot用の環境・サービステンプレートを独自に作ってやってみても良いかもですね。

4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1