Upgrade to Pro — share decks privately, control downloads, hide ads and more …

サーバレスアーキテクチャでLINE BOTが多分作れるようになるハンズオン

サーバレスアーキテクチャでLINE BOTが多分作れるようになるハンズオン

Yoshiki Kobayashi

December 19, 2020
Tweet

More Decks by Yoshiki Kobayashi

Other Decks in Programming

Transcript

  1. 1. 本日のハンズオンについて 2. 今日の成果物 3. サーバレスアーキテクチャの説明 4. じゃあデメリットは? 5. Lambdaを設定してみる

    6. API Gatewayを使うよ 7. LINEと連携してみよう 8. APIと連携してみよう 9. オリジナル要素を入れるには 10. 最後に 本日のアジェンダ 4
  2. 本日のハンズオンについて 10 めっちゃいろいろ活動できた 環境も変わった • 転職(上流現場の何でも屋 → 自社サ開発エンジニア) • オンラインLT(メンター繋がりで二回ほど)

    • オンラインハンズオン(試験的なもの含め二回) • オフラインハンズオン登壇(本日含め二回目) • 利用言語(Golang, Java, Kotlin) プライベートもいろいろ変わったので興味ある人は忘年会か何かで聞いてね
  3. 本日のハンズオンについて 15 ハンズオンについての諸注意② • 2020年12月時点のAWS、LINEをベースにしてます • サービス仕様が変わることもあります ※ • ハンズオン当日までに画面が変わってたら泣く

    • オンライン参加の方はマイクミュートでお願いします • ガヤスレッドをSlackに建てるのでそこに質問ください • もちろんmeetで話しかけてもらってもOKです! • みんなでわいわい楽しくやりましょう!!!!!
  4. サーバレスアーキテクチャの説明 34 サーバレスアーキテクチャ (Lambda + API Gateway + DynamoDBを使った例) アクセスする人

    Webアプリケーション API Gateway Lambda DynamoDB リクエストを API Gatewayで受ける Lambdaで 任意の処理を実行 (使うなら)DynamoDBとかも 使ってデータ保存も可
  5. サーバレスアーキテクチャの説明 42 • 通知機能 ◦ アプリで無理やりできなくはないけど・・・ • キューイング ◦ 規模は?どのくらいの感覚でキューが貯まる??

    • 大容量ストレージ ◦ Webサーバと兼任しても良いけどメンテがなぁ • ビデオストリーミング ◦ いや、どんな技術使えばええんや
  6. Lambdaを設定してみる 95 こちらのコードをLambdaにコピペ! exports.handler = async (event) => { const

    max = 50; for (let i = 1; i <= max; i++) { if (i % 3 === 0 && i % 5 === 0) { console.log("Fizz Buzz") } else if (i % 3 === 0) { console.log("Fizz") } else if (i % 5 === 0) { console.log("Buzz") } else { console.log(i) } } };
  7. API Gatewayを使うよ 114 API Gatewayでリクエストを受け取る時のイメージ http://example.comに アクセス ブラウザに レスポンスを返却 Lambda

    DynamoDB Amazon SQS Amazon SNS アクセスは API Gateway で受け取る 連携するサービスを 自由に選択
  8. API Gatewayを使うよ 132 なぜ ブラウザに [null] と表示されるのか exports.handler = async

    (event) => { const max = 50; for (let i = 1; i <= max; i++) { if (i % 3 === 0 && i % 5 === 0) { console.log("Fizz Buzz") } else if (i % 3 === 0) { console.log("Fizz") } else if (i % 5 === 0) { console.log("Buzz") } else { console.log(i) } } };
  9. API Gatewayを使うよ 133 exports.handler = async (event) => { const

    max = 50; for (let i = 1; i <= max; i++) { if (i % 3 === 0 && i % 5 === 0) { console.log("Fizz Buzz") } else if (i % 3 === 0) { console.log("Fizz") } else if (i % 5 === 0) { console.log("Buzz") } else { console.log(i) } } }; そもそもこのコード、 console.log()で ログ出力するだけで レスポンス返してなくね??? なぜ ブラウザに [null] と表示されるのか
  10. API Gatewayを使うよ 134 Fizz Buzzのコードをこんな感じに変えてみてください exports.handler = async (event) =>

    { const max = 50; let arr = []; for (let i = 1; i <= max; i++) { if (i % 3 === 0 && i % 5 === 0) { arr.push("Fizz Buzz"); } else if (i % 3 === 0) { arr.push("Fizz"); } else if (i % 5 === 0) { arr.push("Buzz"); } else { arr.push(i); } } return {data: arr} };
  11. API Gatewayを使うよ 140 (余談) JavaScriptは明示的にreturnしないと値が返らない function test() { var a

    = “aaaaa” return a } function test2() { var a = “aaaaa” } console.log(test()); // “aaaaa” console.log(test2()); // undefined
  12. API Gatewayを使うよ 141 (余談) Rubyの動きは個人的に不気味 def test a = “aiueo”

    end def test2 a = “aiueo” return a end def test3 “aiueo” end p test # “aiueo” p test2 # “aiueo” p test3 # “aiueo” 明示的にreturnしなくても最後に評価された式が返却される
  13. API Gatewayを使うよ 142 (余談)こんな事が発生するから 一律明示的に書いてあげた方が良いと思うタイプ def test(bool) If bool return

    “true” end “false” end def test2(bool) If bool “true” end “false” end p test(true) # “true” p test(true) # “false”
  14. LINEと連携してみよう 162 まずここに着目 API Gateway Lambda スマートフォン (LINE アプリ) さっき作った

    アカウント “こんにちは!” ってメッセージ送信 “こんにちは!◦◦さん” ってメッセージを送信元に 返信 Webhookイベント送信 Lambdaキック なんらかしらの 処理結果を載せて Messaging APIを実行 LINE Messaging API (LINEが用意したAPI)
  15. LINEと連携してみよう 164 次はここ API Gateway Lambda スマートフォン (LINE アプリ) さっき作った

    アカウント “こんにちは!” ってメッセージ送信 “こんにちは!◦◦さん” ってメッセージを送信元に 返信 Webhookイベント送信 Lambdaキック なんらかしらの 処理結果を載せて Messaging APIを実行 LINE Messaging API (LINEが用意したAPI)
  16. LINEと連携してみよう 165 LINEアカウント → API Gateway LINEアカウントにメッセージが送られると、LINEのサーバから API GatewayにHTTPリクエストが送られる この仕組みをWebhookと呼ぶ

    メッセージ送信 任意のリクエスト先 任意のリクエスト先 任意のリクエスト先 HTTPリクエスト (Webhook)送信 今回の例だとここが API GatewayのURLになる スマートフォン (LINE アプリ) テストBOT Aさん テストBOT Bさん テストBOT Cさん
  17. LINEと連携してみよう 167 LINEアカウント → API Gateway 「作成したLINEのアカウント」にメッセージが送られたことの通知 をもらうイメージ “こんにちは!”って メッセージ送信

    Webhook送信先として 作成した API Gateway msg: “こんにちは! ” From: “◦◦” Msg: “こんにちは! ” LINEの サーバ的な 物 From: “◦◦” To: “テストBOT” Msg: “こんにちは! ” 〇〇って人からテストBOTっていう アカウントにメッセージ来たから、内 容と一緒に通知(Webhook)しとこ これがWebhookと呼ばれる物 “こんにちは!”って メッセージが届く! スマートフォン (LINE アプリ) 画面で設定したWebhookURLに通 知
  18. LINEと連携してみよう 168 最後はこれ! API Gateway Lambda スマートフォン (LINE アプリ) さっき作った

    アカウント “こんにちは!” ってメッセージ送信 “こんにちは!◦◦さん” ってメッセージを送信元に 返信 Webhookイベント送信 Lambdaキック なんらかしらの 処理結果を載せて Messaging APIを実行 LINE Messaging API (LINEが用意したAPI)
  19. LINEと連携してみよう 169 Lambda → LINE 任意のアカウント(今回だと送り元)に 任意のメッセージを送る BOTからメッセージが返却されてく る! msg:

    “こんにちは!テス トBOTです” LINEの サーバ的な 物 To: “〇〇” Msg: “こんにちは!テ ストBOTです” メッセージをリクエストに付与 “こんにちは!テストBOTです” ってメッセージを送信 Lambda LINE の用意したMessaging API をLambdaから実行 スマートフォン (LINE アプリ)
  20. LINEと連携してみよう 172 流れを再掲 API Gateway Lambda スマートフォン (LINE アプリ) さっき作った

    アカウント “こんにちは!” ってメッセージ送信 “こんにちは!◦◦さん” ってメッセージを送信元に 返信 Webhookイベント送信 Lambdaキック なんらかしらの 処理結果を載せて Messaging APIを実行 LINE Messaging API (LINEが用意したAPI) Webhookイベントへのレスポンス で はなく Messaging APIを実行して Lambdaからメッセージを送信
  21. LINEと連携してみよう 177 Clone & ブランチの切り替え ターミナルを開き任意のフォルダでgit clone $ git clone

    https://github.com/yoshi0202/serverless-handson ※エディタで開けるような箇所がCloneするのが良さそう! 移動 $ cd serverless-handson ブランチの切り替え $ git checkout hello-lambda
  22. LINEと連携してみよう 182 でもそれだと・・・ • Git管理どうするの? ◦ ブラウザで直接デプロイできるので管理しづらい • 規模が大きくなった時にブラウザコーディングはつらい ◦

    そうだよねぇ〜 • やっぱりお気に入りのエディタで開発したい! ◦ Vimを崇めよ・・・ • (npmモジュール追加したい時どうするんだ・・?)
  23. LINEと連携してみよう 191 設定箇所でいうとこいつ API Gateway Lambda スマートフォン (LINE アプリ) さっき作った

    アカウント “こんにちは!” ってメッセージ送信 “こんにちは!◦◦さん” ってメッセージを送信元に 返信 Webhookイベント送信 Lambdaキック なんらかしらの 処理結果を載せて Messaging APIを実行 LINE Messaging API (LINEが用意したAPI)
  24. LINEと連携してみよう 195 (余談)ルートってなに? Railsでいうと routes.rbみたいなもの Rails.application.routes.draw do # For details

    on the DSL available within this file, see http://guides.rubyonrails.org/routing.html namespace :book do get '/index', to: 'book#index' get '/search', to: 'book#search' end end
  25. LINEと連携してみよう 213 最後に Channel access token を発行! (LINE API 使うために必要なAPI

    キーみたいなもの) このボタンをクリック! 次に使うのでコピーしておく!
  26. LINEと連携してみよう 216 (余談) 先ほど発行したchannel access token(以下token) Long-lived バージョンといって有効期限がありません。 LINE 側の見解としては

    「Long-lived使わずに 有効期限付きのtoken使ってくれや〜」 ってことっぽいです。 (前職でもそうやってた) https://developers.line.biz/ja/reference/messaging-api/#issue-channel-access-token
  27. 外部APIと連携してみよう 251 全体像再掲 API Gateway Lambda スマートフォン (LINE アプリ) さっき作った

    アカウント “こんにちは!” ってメッセージ送信 “こんにちは!◦◦さん” ってメッセージを送信元に 返信 Webhookイベント送信 Lambdaキック なんらかしらの 処理結果を載せて Messaging APIを実行 LINE Messaging API (LINEが用意したAPI)
  28. 外部APIと連携してみよう 252 ここを少しいじってあげるよ〜 API Gateway Lambda スマートフォン (LINE アプリ) さっき作った

    アカウント “こんにちは!” ってメッセージ送信 “こんにちは!◦◦さん” ってメッセージを送信元に 返信 Webhookイベント送信 Lambdaキック なんらかしらの 処理結果を載せて Messaging APIを実行 LINE Messaging API (LINEが用意したAPI) 条件によって QiitaAPIを実行
  29. 外部APIと連携してみよう 267 ‘/’ って、どのHTTPメソッドの設定してたっけ API Gateway Lambda スマートフォン (LINE アプリ)

    さっき作った アカウント “こんにちは!” ってメッセージ送信 “こんにちは!◦◦さん” ってメッセージを送信元に 返信 Webhookイベント送信 Lambdaキック なんらかしらの 処理結果を載せて Messaging APIを実行 LINE Messaging API (LINEが用意したAPI)
  30. オリジナル要素を入れるには 284 使い辛いポイント • 検索できないのイケてないよなぁ ◦ 検索機能を入れてみる • ページングできないのイケてないよなぁ ◦

    リクエストにパラメータ付与して「次へ」って打ったら次の5 件とか取得できるようにしてみる • 最新しか記事しか取得できないのイケてないよなぁ ◦ LGTM順、ストック順で取得できるようにしてみる
  31. オリジナル要素を入れるには 285 もっと使いやすくするには • Qiitaって打つのめんどくさい ◦ LINEのリッチメニューとか使ってみる • Qiita以外にも対応したい ◦

    まずは一問一答から機能を増やしてみる • Slackとかと連携してみたい ◦ Slackの仕組みも一緒に調べて機能を追加してみる
  32. 最後に 295 本日勉強したこと • LINE アカウントとのやりとりができるようになった ◦ WebHookの概念 ◦ Messaging

    API を使ったメッセージ送信 • API Gateway + Lambda を組み合わせてAPIが作れた ◦ EC2未構築でリクエストの受け口が作れた ◦ Lambdaキックまでの流れを理解することができた ◦ Lambdaにプログラムをデプロイすることができた