ヤマムギ

growing hard days.

*

LINEとAWSとTwilioとkintoneでBOTを作ってみるハンズオン (5) LINEからの投稿へ返信と登録処理

      2017/08/16


作る部分

LINEからのメッセージを受けて各APIより返信し、StepFunctionsを起動して登録処理へデータを流します。

LINEのトークンの確認

まだLINE Messaging APIのキーを作成していない方は LINE Messaging APIの設定をするを参照してキーを作成してください。

LINE BUSINESS CENTERにアクセスしてログインします。

右上の[会社/事業者未選択]をクリックして、今回用に設定した会社/事業者を選択します。

[LINE Developers]をクリックします。

下にスクロールして Channel Access Token の[ISSUE]をクリックして表示されたChannnel Access Tokenをコピーして控えます。

ついでに表示されたQR Codeを使ってLINEの友達にbotを追加しておきます。

docomo雑談APIキーの確認

まだdocomo雑談APIキーを取得していない方はdocomo雑談APIのAPIキーを発行するを参照してAPIキーを発行してください。

docomo Developer support マイページへログインします。

API keyを控えておきます。

StepFunctionsのARNの確認

LINEとAWSとTwilioとkintoneでBOTを作ってみるハンズオン (4)Step Functionsで複数のLambdaを実行制御するで作ったStepFunctionsのARNを確認します。

StepFunctionsのダッシュボードにARNが表示されてますが、コピーが出来ません。

なのでクリックして開きます。

実行一覧をクリックして実行一覧に行きます。

ステートマシンARNが表示されているのでテキストエディタなどにコピーしておきます。

プログラムのダウンロード

Github-yamamugi_handson_to_kintoneにあります。

こちらのダウンロードリンクからダウンロードしてください。

プログラムの解説

一部抜粋

  • LINEからWebhookで送られたテキストを受け取ります。
  • あわせて送られているリプライトークンも取得します。
  • テキストに応じたメッセージを設定します。
  • リプライトークンとメッセージをdataとしてrequestsモジュールでPOSTします。
  • 取得したLINEの識別用の内部IDをStepFunctionのINPUTPATHに渡して実行します。

####livedoor Weather Hacks

  • テキストに「天気」、「雨」、「雪」、「晴」が含まれている場合天気情報を取得します。
  • 大阪(city_id 27000)に限定しています。
  • お天気webサービス仕様にAPI仕様があります。
  • 天気と気温を取得しています。

wikipedia検索

  • テキストに「って何」が含まれている場合に検索します。
  • wikipediaモジュールを使用して検索しています。
  • 1件目の検索結果でページ取得が失敗する場合があるのでその場合は2件目で取得します。
  • 200文字の説明文とWikipediaのURLを返します。

インフォーメーションカード

  • LINEのリプライデータでtypeをtemplate,templateのタイプをcarouselとしてカード型の案内を返しています。
  • thumbnailImageUrlは公開されたwebサーバに画像を置いています。

docomo雑談API

  • どの条件にも当てはまらない場合に使用しています。
  • docomo雑談APIのPython SDKを使用しています。
  • テキストに対しての戻り値を返しています。

IAMロールの作成

Lambdaを実行するロールに対して、StateFunctionsを実行出来る権限を付与する必要があります。

ポリシーの内容を分かりやすくするためにPolicy Generatorを使用しています。

LambdaからStepFunctionsポリシーの作成

LambdaがCloudWatchにログを出力を出来るようポリシーを作成します。

IAMマネジメントコンソールで[ポリシー]-[ポリシーの作成]をクリックします。

Policy Generatorを使用します。

効果 : 許可
AWSサービス : AWS StepFunctions
アクション : StartExecution
ARN : arn:aws:states:ap-northeast-1:********:stateMachine:sf_1
(StepFunctionsのARNを指定します)

[ステートメントを追加]をクリックします。

[次のステップ]をクリックします。

名前を step_functions_execute にします。

Policy Generatorを使わなくても最終的にはこのJSONが書ければそれでOKです。

[ポリシーの作成]をクリックします。

LambdaからCloudWatchにログを作るポリシーの作成

LambdaがCloudWatchにログを出力を出来るようポリシーを作成します。

IAMマネジメントコンソールで[ポリシー]-[ポリシーの作成]をクリックします。

Policy Generatorを使用します。

効果 : 許可
AWSサービス : Amazon CloudWatch Logs
アクション : CreateLogGroup , CreateLogStream , PutLogEvents
ARN : arn:aws:logs:::*

[ステートメントを追加]をクリックします。

こうなって

こうなります。
名前を lambda-put-log にします。
Policy Generatorを使わなくても最終的にはこのJSONが書ければそれでOKです。

※ ARNは「arn:aws:logs:::」でも「arn:aws:logs:::」でもOKです。

IAMロールの作成

[ロール] – [新しいロールの作成]をクリックします。

ロールタイプは「AWS Lambda」を選択します。

先ほど作成した2つのポリシーを選択します。
* step_functions_execute
* lambda-put-log

ロール名を「lambda_step_functions」とします。

作成したロールの[アクセス許可]タブで2つのポリシーがアタッチされていることを確認します。

Lambda関数の作成

AWSマネジメントコンソールでLambdaを開いて、[関数の作成]をクリックします。

何も選択せず、[一から作成]をクリックします。

何も選択せず、[次へ]をクリックします。

名前 : from_line
説明 : ヤマムギハンズオン LINEからデータを受信/返信
ランタイム : Python 3.6

コードエントリタイプは「.zipファイルをアップロード」でyamamugi_handson_from_lineからダウンロードしたZIPファイルをアップロードします。

環境変数

  • LINE_TOKEN : LINEのChannnel Access Token
  • DOCOMO_API_KEY : docomo雑談API key
  • STATE_MACHINE_ARN : StepFunctionsのステートマシーンのARN
  • LOG_LEVEL : DEBUG(ログを減らしたい場合は ERRORかINFOを設定します)

[既存のロールを選択]で先ほど作った lambda_step_functions を選択します。

必要ないとは思いますが、念のためタイムアウトを5分にしておきます。
[次へ]をクリックします。

[関数の作成]をクリックします。

API Gatewayの作成

[APIの作成]をクリックします。

API名を任意で設定して、[APIの作成]をクリックします。

[アクション] – [リソースの作成]をクリックします。

リソース名に from_line と入力して[リソースの作成]をクリックします。

作成したリソースを選択して[アクション]-[メソッドの作成]をクリックします。

POSTを選択して[✓]をクリックします。

  • 統合タイプ : Lambda関数
  • Lambdaリージョン : ap-northeast-1
  • Lambda関数 : from_line

を設定して[保存]をクリックします。

OKをクリックします。

[アクション]-[APIのデプロイ]をクリックします。

デプロイされるステージ : [新しいステージ]
ステージ名 : (任意のステージ名)

[デプロイ]をクリックします。

[ステージ]を選択してデプロイされたステージを展開します。
[POST]を選択して右ペインのURLを控えておきます。

LINE Webhook URLにAPI Gatewayエンドポイントを設定

[LINE Developers]の画面(QRコードとChannenl Access Tokenが表示されていた画面)を開きます。

[EDIT]ボタンをクリックします。

Webhook URLにAPI GatewayのURLを貼り付けて[SAVE]をクリックします。

試してみます

「お得な情報は?」とか、
「天気は?」とか、
「XXって何?」とか、
どうでもいい話とかLINEで友達登録しておいた自分のbotに話しかけてみます。

返事を返してくれて、

kintoneに登録されて、

Slackに通知がされます。

目次

(1)LambdaからSlackへ通知する1

(2)LambdaからSlackへ通知する2

(3)Lambdaからkintoneへレコードを登録する

(4)Step Functionsで複数のLambdaを実行制御する

(5)LINEからの投稿へ返信と登録処理 ←今ここ

(6)Twilioからの電話受付と登録処理

(7)ラッキーコンテンツ

@yamamanx

開発ベンダー5年、ユーザ企業システム部門通算9年、ITトレーナー1年目のSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。

このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。

また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。

 - event, study , , ,

ad

ad

  関連記事

Developers Summit 2018 「マイクロサービスをAWSサーバレス&コンテナで実装する方法」を聞きました

以下は、思ったことや気になったことをメモしていますので、必ずしも登壇者の発表内容 …

Java SE 7 Silver対策勉強をしながらメモ 2015/2/9

練習問題2日目。 同じ問題にひっかかる。つまづく。 集中力が足りない。 途中から …

Alexa Day 2018で「Alexa and Machine Learning on AWS」を聞きました

Photo by 金春さん 20180211 alexa day 2018 Al …

LINEとAWSとTwilioとkintoneでBOTを作ってみるハンズオン (4)Step Functionsで複数のLambdaを実行制御する

作る部分 Step Functionsでこれまで作ったLambdaの実行制御をし …

「kintone カスタマイズハンズオン」に行ってきました

ハンズオン中のメモです Rest API ログイン認証だとトークン認証で出来ない …

「【Twilio x kintone 合同ハンズオン in 大阪】Twilio Studioとkintoneで電話受付システムをつくろう」に行ってきました

「【Twilio x kintone 合同ハンズオン in 大阪】Twilio …

「MasterCloud #9 新春クラウドLT大会」でLTをさせていただきました

Alibaba Cloudを検索してたらconnpassの「MasterClou …

Java SE 7 Silver対策勉強をしながらメモ 2015/2/11

練習問題4日目。 とりあえずひと通り終了。 317問中288問正解、90.85% …

「実践AWSプログラミング in Osaka」に行ってきました

クラスメソッドさんの「実践AWSプログラミング in Osaka」に行ってきまし …

IPython Notebookで梅田のラーメン屋さんの統計情報を抽出するというハンズオンに行ってきました

IPython Notebookで梅田のラーメン屋さんの情報をWebスクレイピン …