31
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS Lambdaを使ってLINEBotを作ってみよう!

Last updated at Posted at 2019-07-31

※この記事はAWSアカウントが作成済みであることを前提としています。
#はじめに
この記事は、2019/2/11に行なった【学生大歓迎】プログラミング未経験者向け Node.js で LINE Bot 開発講座参加者の一部より「botを永続化したい」という要望を受けたため、bot永続化のためのオンラインハンズオンを追加で行なった際に使用した資料です。(2/11のハンズオンの際はngrokを使用したため最長8時間しか動きませんでした。)
#AWS Lambdaとは
AWS (Amazon Web Service)のサービス(Faas)で、サーバレスでNode.jsやPython等を動かす事ができます。
#システム構成
image.png
LINEサーバからのwebhookをAPI Gatewayで受け取り、それをLambdaの関数に渡す形になります。
#Botのチャネルを作ろう!
こちらの記事を参考にLINEBotのチャネルを作成して下さい。
#Lambdaの関数を作ろう!

スクリーンショット 2019-06-10 18.51.39.png - メールアドレスとパスワードを入力してサインインします。 - サインインするとマネジメントコンソールが出てくるので、検索バーに「Lambda」と入力して「Lambda」を選択して下さい。 スクリーンショット 2019-06-10 18.54.15.png - Lambdaのコンソール画面が開くので右上にある「関数を作成」を押します スクリーンショット 2019-06-10 18.54.22.png - 関数名、ランタイム、実行ロールを選択し、「関数を作成」を押します。(関数名は適当で結構です。また、既にロールがある方は新規作成しなくても結構です。) スクリーンショット 2019-06-10 18.55.21.png - 関数作成完了です! スクリーンショット 2019-06-10 18.57.21.png

#API Gatewayの設定をしよう!
##APIを作成しよう

  • 左上の「AWS」を右クリックして新しいタブで開きます。
スクリーンショット 2019-06-19 20.51.49.png - Api Gatewayを開きます。 スクリーンショット 2019-06-19 20.52.56.png - 左上の「APIの作成」を押します。 ※初めてAPIを作成する場合はこの画面が出てこない事があります スクリーンショット 2019-06-19 20.53.04.png - 適当に名前を入力したら右下の「APIの作成」を押して下さい。 スクリーンショット 2019-06-19 20.53.38.png - 以上でAPIの作成は完了です!

##APIの設定をしよう!

  • 「アクション」を押すとプルダウンメニューが出てくるので「メソッドの作成」を選択してください。
    uploading-0

  • こいつをクリックします

スクリーンショット 2019-06-19 20.57.49.png - POSTを選択して下さい スクリーンショット 2019-06-19 20.57.56.png - チェックマークを押して下さい。 スクリーンショット 2019-06-19 20.58.00.png - 「Lambda統合プロキシの利用」にチェックを入れて、「Lambda関数」に先程作成した関数の名前を入力してから「保存」を押して下さい。 スクリーンショット 2019-06-19 21.02.03.png
  • 「Lambdaに権限を追加する」というポップアップが出てくるので「OK」を押します。
    image.png
  • これでPOSTリクエストを受け取ることが出来るようになりました!
  • 次に「メソッドリクエスト」を選択して下さい。
スクリーンショット 2019-06-19 21.07.59.png - 「HTTP リクエストヘッダー」を選択して、「ヘッダーの追加」を押して下さい。 スクリーンショット 2019-06-19 21.08.55.png - ```X-Line-Signature``` と入力してチェックマークを押して下さい。 スクリーンショット 2019-06-19 21.09.44.png - 「必須」にチェックマークを入れて下さい。 スクリーンショット 2019-06-19 21.10.30.png - 「アクション」を押すとプルダウンメニューが出てくるので、「APIのデプロイ」を押して下さい スクリーンショット 2019-07-14 20.04.58.png - 「デプロイされるステージ」の右にある四角いやつを押して、「新しいステージ」を選択して下さいスクリーンショット 2019-07-14 20.05.29.png - ステージ名を入力して下さい ※今回は「prod」にします スクリーンショット 2019-07-14 20.33.15.png - 「デプロイ」を押して下さいスクリーンショット 2019-07-14 20.33.15.png - これでAPIの作成は完了です!

※リクエストが本当にLINEから送られてきたものかを確認するために署名検証を行う必要があります。(検証しなくてもBotを動かすことは一応可能です。)
X-Line-Signatureには、その検証を行うための署名が記載されています。
X-Line-Signatureがリクエストヘッダーに含まれていないリクエストはLINEからのものではないため、受け取る必要がありません。なので、APIGateway側であらかじめ弾く設定にしています。
#Botのコードを書こう!
##Lambdaにコードをアップロードしよう!
※Lambdaはインラインエディタを使用してブラウザ上で直接コードを書くことが可能ですが、今回はモジュールが必要になるので纏めてzipでアップロードしていきます。

  • いよいよBotのコードを書いていきます。こちらのページを開いて「Clone or download」をクリックし、「Download ZIP」を選択して下さい。スクリーンショット 2019-06-19 21.41.41.png
  • zipを解凍してください。
  • 解凍して出てきたフォルダを開いて、中のファイルを纏めて圧縮します
スクリーンショット 2019-07-14 19.42.05.png ※zip形式でコードをLambdaにアップロードするには、関数名のフォルダ直下にindex.jsを置く必要があります(/関数名のフォルダ/index.jsという形)。ダウンロードしたzipをそのままアップロードしてしまうと以下の画像のように「/関数名のフォルダ/bot_lambda-master/index.js」となってしまうため、動作しません。 スクリーンショット 2019-07-14 19.43.23.png - 先ほど作ったLambda関数を開き、「コードをインラインで編集」というボタンを押してください スクリーンショット 2019-07-14 19.37.08.png - 「.zipファイルをアップロード」を押してください スクリーンショット 2019-07-14 19.37.11.png - 「アップロード」を押してくださいスクリーンショット 2019-07-14 19.40.06.png - 先ほど圧縮したzipファイルを選択し、「開く」を押しますスクリーンショット 2019-07-14 19.48.14.png - 「保存」を押しますスクリーンショット 2019-07-14 19.48.18.png - 以下のような画面になれば成功です! スクリーンショット 2019-07-14 19.48.41.png

##環境変数にアクセストークンとチャンネルシークレットを入力しよう
※コードに直接アクセストークンを書くと精神衛生上良くないので、環境変数を使用します

  • LINEDevelopersのBotのページを開き、アクセストークンの項目にある「再発行」を押して下さい
    image.png
  • 特に変更はせず、そのまま「再発行」を押しますimage.png
  • 出てきた文字列をコピーしますスクリーンショット 2019-07-14 19.55.29.png
  • 先ほど作ったLambda関数を開き、下の方にある「環境変数」のキーに ACCESSTOKEN と入力して下さいスクリーンショット 2019-07-14 19.56.57.png
  • 「値」には先ほどコピーした文字列を貼り付けますスクリーンショット 2019-07-14 19.57.01.png
  • Botのページを開き、Channel Secretをコピーしますスクリーンショット 2019-07-15 13.31.53.png
  • Lambdaの下の方にある「環境変数」のキーに CHANNELSECRET と入力して下さいスクリーンショット 2019-07-15 13.33.19.png
  • 「値」には先程コピーした文字列を貼り付けますスクリーンショット 2019-07-15 13.33.28.png
  • 右上の保存を押します
スクリーンショット 2019-07-14 19.57.26.png

##Webhook送信をオンにしよう!

※LINEからの通知を先ほど作ったLambda関数が受け取れるように、Webhookの設定をしていきます。

  • 先程作ったLambda関数を開いて下さいスクリーンショット 2019-07-14 21.08.56.png
  • 「APIGateway」を押して下さい
    ※URLが表示されない方は一度ページをリロードしてみて下さい
スクリーンショット 2019-07-14 21.08.56.png - 「APIエンドポイント」の隣にあるURLをコピーして下さいスクリーンショット 2019-07-14 21.09.53.png - botのページを開いて、「Webhook URL」の項目にある「編集」ボタンを押して下さいスクリーンショット 2019-07-14 21.11.14.png - 先程コピーしたURLを貼り付けて https:// を削除します![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260292/b18890e9-7cf0-9e62-e610-214a4a9dfa2b.png) - 「更新」を押します![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260292/807406ea-63d6-11d9-f7df-95c3e42944d5.png) - 「Webhook送信」の項目にある「編集」ボタンを押して下さいスクリーンショット 2019-07-14 21.12.08.png - 「利用する」を選択して、「更新」を押します![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260292/9f6ada81-62ba-dd38-d4cc-746dbbfdb1e2.png) - ページをリロードして、変更が反映されているか確認します

※たまに反映されていない場合があるので、その場合は再度設定変更を行なって下さい

  • 以下のような状態になっていれば設定完了です!
スクリーンショット 2019-07-14 21.16.17.png ※apiのURLにモザイクをかけていませんが、当該APIは既に削除済みなので公開しても問題ないと判断し、そのまま掲載しています。モザイクあるとわかりにくくなるしね!

#作ったBotを試してみよう!

  • botのページに友達追加用のQRコードが載っているので、そこからbotを友達追加します
スクリーンショット 2019-07-14 19.59.04.png - メッセージを送信して、送ったメッセージがそのまま返ってくれば成功です。

#おまけ
以下の資料の「おまけ」の手順で、「こんにちは」というメッセージが送られてきたら「Hello World」と返信して、「おはよう」と送られてきおたら「Good Morning!!」と返信するという事が出来ます。
https://qiita.com/shinbunbun_/items/b1d82f5bd85786a7f06e#%E3%81%8A%E3%81%BE%E3%81%91
また、以下の資料の「はじめに」〜「確認テンプレートを返信してみよう!」と同じ手順でテンプレートメッセージを返信することが出来ます。
https://qiita.com/shinbunbun_/items/81db9b7973553b2d665d

#前回ハンズオン参加者の方々へ
messageFuncは前回のハンズオンの際に使用したコードと全く同じになっています。

31
37
0

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
31
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?