SlideShare a Scribd company logo
1 of 20
API Gateway + Lambdaで
LINE通知サービス構築
2016年10月6日
木村健一郎
名前:木村健一郎
所属:株式会社コム・アンド・コム
JAWS-UG福岡
さくらクラブ福岡IoT
お仕事:技術に関することはなんでも
好きな言語:perl
好きなDB:PostgreSQL
今日のお題:
LambdaでLINEに通知するサービスを作る
LINE Messaging API/LINE Notify
• 2016/4/7にBOT APIは公開されてた
• 利用者からの入力を受けて、それに返す
• Messaging APIが先日(2016/9/29)公開された
• 外部からAPI叩いてLINEに送信できる
• かなり色々出来そう(まだ試してない)
• LINE Notifyの公開(2016/9/29)
• 外部からAPI叩いてLINEに通知を送れる
• MackerelやIFTTTが公開済み
• さっそくNotifyで遊んでみた
• せっかくなんでServerlessフレームワーク使ってみた
準備するもの
• LINE自体のアカウント
PCからログインできるようにしておく必要があります
• LINE Developerへの登録
この辺から登録しましょう
https://business.line.me/ja/services/bot
• Nodeとpythonが動くマシン
私はNode6.6.0/Serverless 0.5.6/Python2.7.12で試しました
処理の流れ
API Gateway + Lambda
①アクセス
LINEのサーバ
②リダイレクト
③ログインページ
④認証
⑤認証情報(code)返信
⑥oauth APIコール
⑦token返信
⑧token使ってメッセージ送信
⑨メッセージプッシュ
今回の構成
インターネットhttpアクセス
CSRF対策/oauthのトークンと利用者を紐付けるキーの保存
準備
IMAロールやDynamoDBの設定を先にやっておきましょう(詳細略)
• LINE notifyのサイトでアプリケーションを登録しておきます
• https://notify-bot.line.me/ja/
• アプリケーション名はメッセージが「[アプリ名]ほげほげ」という感じになります
• クライアントIDと秘密鍵をメモっておきます
• Callbackはアプリ作成時に入力求められますが、適当でいいです
• DynamoDBのテーブル作成
• テーブル名「line-message」、スキーマは「state」というテキストだけ
• IAMユーザならびにロールの作成
• serverless用にAdministratorAccessのユーザ
• Dynamodbの読み書きが出来るロール
serverlessをインストールしてプロジェクト作成
%sudo npm install serverless –g
%sls project create
_______ __
| _ .-----.----.--.--.-----.----| .-----.-----.-----.
| |___| -__| _| | | -__| _| | -__|__ --|__ --|
|____ |_____|__| ___/|_____|__| |__|_____|_____|_____|
| | | The Serverless Application Framework
| | serverless.com, v0.5.6
`-------'
Serverless: Initializing Serverless Project...
Serverless: Enter a name for this project: (serverless-ryqpyr)line-message
Serverless: Enter a new stage name for this project: (dev) dev
Serverless: For the "dev" stage, do you want to use an existing Amazon Web Services profile or create a new one?
Existing Profile
> Create A New Profile
Serverless: Please enter the ACCESS KEY ID for your Admin AWS IAM User: *****
Serverless: Enter the SECRET ACCESS KEY for your Admin AWS IAM User: *****
Serverless: Enter the name of your new profile: (hoge_dev)
Serverless: Creating stage "dev"...
Serverless: Select a new region for your stage:
us-east-1
us-west-2
eu-west-1
eu-central-1
> ap-northeast-1
Serverless: Creating region "ap-northeast-1" in stage "dev"...
Serverless: Deploying resources to stage "dev" in region "ap-northeast-1" via Cloudformation (~3 minutes)...
最初にリダイレクトする/authと、認証情報のコールバックを受ける/callbackの2つのエンドポイントを作成
エンドポイントの作成
%sls function create auth
%sls function create callback
CSRF対策の文字列を作ってDynamoDBに保存して、リダイレクトするコードをauth/handler.pyに書きます
authの作成(1)
from __future__ import print_function
import json
import logging
import uuid
import hashlib
import boto3
log = logging.getLogger()
log.setLevel(logging.DEBUG)
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('line-message')
def handler(event, context):
log.debug("Received event {}".format(json.dumps(event)))
token = hashlib.md5(str(uuid.uuid4())).hexdigest()
table.put_item(
Item={
"state" : token
}
)
return {"location" : "https://notify-
bot.line.me/oauth/authorize?response_type=code&client_id=***&redirect_uri=https://******/dev/callback&scope=notify&resonse_mode=fo
rm_post&state="+token}
302でリダイレクトするようにapi gatewayの設定をauth/s-function.jsonに書きます。DynamoDBにアクセスするためのロールもここ
に記載します。
authの作成(2)
・・・・
"customRole": "arn:aws:iam::***************",
・・・・・
"responses": {
"400": {
"statusCode": "400"
},
"default": {
"statusCode": "302",
"responseParameters": {
"method.response.header.Location" : "integration.response.body.location"
},
ハンドラーの戻り値をLocationヘッダに出す
LINEサーバから渡された情報を元にOauthを行って、その結果をHTMLで表示します。callback/handler.pyに書きます。
前半の、受け取ったCSRFトークンが正しいかの検証部分です。
callbackの作成(1)
from __future__ import print_function
import json
import logging
import boto3
import urllib
import urllib2
import json
log = logging.getLogger()
log.setLevel(logging.DEBUG)
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('line-message')
def handler(event, context):
res = table.get_item(
Key={
'state':event['state']
}
)
if res['Item']:
table.delete_item(
Key={
'state':event['state']
}
)
後半のoauthを呼ぶ部分です
callbackの作成(2)
url = 'https://notify-bot.line.me/oauth/token'
postvalue = {
'grant_type' : 'authorization_code',
'code' : event['code'],
'redirect_uri' : 'https://********/dev/callback',
'client_id' : ‘**********',
'client_secret' : ‘*********',
}
postdata = urllib.urlencode(postvalue);
req = urllib2.Request(url,postdata)
response = urllib2.urlopen(req)
page = response.read()
return page
else:
return "not found"
ハンドラーへのパラメータ受け渡しと、結果をtext/htmlで返すapi gatewayの設定をcallbac/s-function.jsonに書きます。
DynamoDBにアクセスするためのロールもここに記載します(text/htmlで返すのは不要かも・・)。
callbackの作成(2)
・・・・
"customRole": "arn:aws:iam::***************",
・・・・・
"requestTemplates": {
"application/json": {
"state" : "$input.params('state')",
"code" : "$input.params('code')"
}
},
"responses": {
"400": {
"statusCode": "400"
},
"default": {
"statusCode": "200",
"responseParameters": {},
"responseModels": {
"text/html;charset=UTF-8": "Empty"
},
"responseTemplates": {
"text/html;charset=UTF-8": "$input.path('$')"
}
}
}
ここで入力のテンプレートを定義すると
ハンドラーの第1引数(event)にハッシュで渡る
出力をtext/htmlとして、Velocityの出力を出すようにする
デプロイします。カーソルキーとリターンで全てのfunctionとendpointを選んで「Deploy」を選びます
デプロイ
%sls dash deploy
| _ .-----.----.--.--.-----.----| .-----.-----.-----.
| |___| -__| _| | | -__| _| | -__|__ --|__ --|
|____ |_____|__| ___/|_____|__| |__|_____|_____|_____|
| | | The Serverless Application Framework
| | serverless.com, v0.5.6
`-------'
Use the <up>, <down>, <pageup>, <pagedown>, <home>, and <end> keys to navigate.
Press <enter> to select/deselect, or <space> to select/deselect and move down.
Press <ctrl> + a to select all, and <ctrl> + d to deselect all.
Press <ctrl> + f to select all functions, and <ctrl> + e to select all endpoints.
Press <ctrl> + <enter> to immediately deploy selected.
Press <escape> to cancel.
Serverless: Select the assets you wish to deploy:
auth
> function - auth
endpoint - auth - GET
callback
function - callback
endpoint - callback - GET
- - - - -
Deploy
Cancel
動かしてみましょう
• authのエンドポイントにアクセス
• LINEの認証後、メッセージをどのグループで受け取るかを
選ぶ
•1対1またはグループが選べるようです
•グループの場合はLINE Notifyをグループに招待します
• うまくいったらトークンが表示されるのでコピペしてメッ
セージ送ってみましょう
%curl -X POST -H "Authorization: Bearer ******" -F 'message=テストです' https://notify-api.line.me/api/notify
注意
• 2016年10月4日時点での情報です
• LINE Messaging APIもserverlessの使い方も変わっている
可能性はあります。必ず最新の公式ドキュメントを参照
してください
• Serverless 、もうすぐ1.0が出てずいぶん変わってるとか
・・
• リダイレクトだけ(auth)をLambdaでやる意味があるかとい
うと微妙?
• トークンの管理は手を抜いています
• エラーハンドリングもしてません
• DynamoDBのnot foundはtry-catchでチェック?
「とりあえず試してみた」のレベルなので以下の点はご注意を
感想
• 受信メッセージが「LINE Notify」っていうグループにまとめられるのがち
ょっと残念
• 直接おしゃべりみたいなのはBOT APIやMessaging APIでやりましょ
うってことかと
• LINE APIのRate limitは1000アクセス/時・トークン。実用上まず問題ないレ
ベル。
• Serverlessフレームワーク便利だけど、どんどん変わっていってて情報が錯
綜気味?
・外部ライブラリをどこに置いといたらいいのか分からなかった
• 「serverless」ってググりにくい・・(´・ω・`)
• テキスト送る程度の個人用途なら、アプリ登録までしないでもtokenだけ取
得も可能なのでここまで作らなくてもOK
• もっと言うならIFTTT + Makerで十分かも(元も子もない)
API Gateway + LambdaでLINE通知サービス構築

More Related Content

Viewers also liked

Viewers also liked (12)

Line messaging api ハンズオン資料 ver1.2
Line messaging api ハンズオン資料 ver1.2Line messaging api ハンズオン資料 ver1.2
Line messaging api ハンズオン資料 ver1.2
 
趣味でサービスを作った話
趣味でサービスを作った話趣味でサービスを作った話
趣味でサービスを作った話
 
コミュニティーハッピーアワーLt資料161214
コミュニティーハッピーアワーLt資料161214コミュニティーハッピーアワーLt資料161214
コミュニティーハッピーアワーLt資料161214
 
Subramanya Rai Resume
Subramanya Rai ResumeSubramanya Rai Resume
Subramanya Rai Resume
 
Linebot
LinebotLinebot
Linebot
 
正しい開発をする
正しい開発をする正しい開発をする
正しい開発をする
 
LINE Messaging apiと戯れる
LINE Messaging apiと戯れるLINE Messaging apiと戯れる
LINE Messaging apiと戯れる
 
S2 messaging api
S2 messaging apiS2 messaging api
S2 messaging api
 
メール受信も API Gateway と Lambda で!〜サービス連携でPaaSを拡張〜
メール受信も API Gateway と Lambda で!〜サービス連携でPaaSを拡張〜メール受信も API Gateway と Lambda で!〜サービス連携でPaaSを拡張〜
メール受信も API Gateway と Lambda で!〜サービス連携でPaaSを拡張〜
 
S3 chat bot & the new world
S3 chat bot & the new worldS3 chat bot & the new world
S3 chat bot & the new world
 
AWS初心者向けWebinar AWSではじめよう、IoTシステム構築(リピート開催用)
AWS初心者向けWebinar AWSではじめよう、IoTシステム構築(リピート開催用)AWS初心者向けWebinar AWSではじめよう、IoTシステム構築(リピート開催用)
AWS初心者向けWebinar AWSではじめよう、IoTシステム構築(リピート開催用)
 
The monad fear
The monad fearThe monad fear
The monad fear
 

Similar to API Gateway + LambdaでLINE通知サービス構築

Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
Yuji Takayama
 

Similar to API Gateway + LambdaでLINE通知サービス構築 (20)

Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWIN
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
HTML5最新動向
HTML5最新動向HTML5最新動向
HTML5最新動向
 
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenote
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 
Spring BootでHello Worldのその先へ
Spring BootでHello Worldのその先へSpring BootでHello Worldのその先へ
Spring BootでHello Worldのその先へ
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
APIMeetup 20170329_ichimura
APIMeetup 20170329_ichimuraAPIMeetup 20170329_ichimura
APIMeetup 20170329_ichimura
 
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようSlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
 

More from Ken'ichirou Kimura

More from Ken'ichirou Kimura (20)

SORACOM UG紹介
SORACOM UG紹介SORACOM UG紹介
SORACOM UG紹介
 
SORACOM UGの運営メンバーになってみませんか?
SORACOM UGの運営メンバーになってみませんか?SORACOM UGの運営メンバーになってみませんか?
SORACOM UGの運営メンバーになってみませんか?
 
SORACOM LTE-M Buttonならびにシミュレータについて
SORACOM LTE-M ButtonならびにシミュレータについてSORACOM LTE-M Buttonならびにシミュレータについて
SORACOM LTE-M Buttonならびにシミュレータについて
 
SORACOM LTE-M Button for Enterpriseシミュレータについて
SORACOM LTE-M Button for EnterpriseシミュレータについてSORACOM LTE-M Button for Enterpriseシミュレータについて
SORACOM LTE-M Button for Enterpriseシミュレータについて
 
スマートフォンでもSORACOM Arc!
スマートフォンでもSORACOM Arc!スマートフォンでもSORACOM Arc!
スマートフォンでもSORACOM Arc!
 
AWS App RunnerでASP.NET Core Webアプリケーションを動かしてみた
AWS App RunnerでASP.NET Core Webアプリケーションを動かしてみたAWS App RunnerでASP.NET Core Webアプリケーションを動かしてみた
AWS App RunnerでASP.NET Core Webアプリケーションを動かしてみた
 
ひげボタンをAzure IoT Centralにつないでみる
ひげボタンをAzure IoT CentralにつないでみるひげボタンをAzure IoT Centralにつないでみる
ひげボタンをAzure IoT Centralにつないでみる
 
Fukuoka Engineers Day 2021 SORACOM UG紹介
Fukuoka Engineers Day 2021 SORACOM UG紹介Fukuoka Engineers Day 2021 SORACOM UG紹介
Fukuoka Engineers Day 2021 SORACOM UG紹介
 
Cloudshell 20201229
Cloudshell 20201229Cloudshell 20201229
Cloudshell 20201229
 
AWS IoT Eventsで遊んでみた
AWS IoT Eventsで遊んでみたAWS IoT Eventsで遊んでみた
AWS IoT Eventsで遊んでみた
 
Soracomug 20200701
Soracomug 20200701Soracomug 20200701
Soracomug 20200701
 
AWSで画像認識をやってみる~DL3分クッキング~
AWSで画像認識をやってみる~DL3分クッキング~AWSで画像認識をやってみる~DL3分クッキング~
AWSで画像認識をやってみる~DL3分クッキング~
 
Fukuten 20200117 up
Fukuten 20200117 upFukuten 20200117 up
Fukuten 20200117 up
 
Amazon Forecastで未来を予測しよう
Amazon Forecastで未来を予測しようAmazon Forecastで未来を予測しよう
Amazon Forecastで未来を予測しよう
 
SORACOM-UG岡山 LT資料 2019-08-17
SORACOM-UG岡山 LT資料 2019-08-17SORACOM-UG岡山 LT資料 2019-08-17
SORACOM-UG岡山 LT資料 2019-08-17
 
Serverless meetuplt 201903_up
Serverless meetuplt 201903_upServerless meetuplt 201903_up
Serverless meetuplt 201903_up
 
あのボタンで子育て支援!
あのボタンで子育て支援!あのボタンで子育て支援!
あのボタンで子育て支援!
 
LogicAppsでお天気ボットを作ろう
LogicAppsでお天気ボットを作ろうLogicAppsでお天気ボットを作ろう
LogicAppsでお天気ボットを作ろう
 
Jawsug福岡 201606 up
Jawsug福岡 201606 upJawsug福岡 201606 up
Jawsug福岡 201606 up
 
SESとLambdaでメールをSlackに通知してみよう
SESとLambdaでメールをSlackに通知してみようSESとLambdaでメールをSlackに通知してみよう
SESとLambdaでメールをSlackに通知してみよう
 

Recently uploaded

Recently uploaded (10)

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

API Gateway + LambdaでLINE通知サービス構築