工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

IFTTTが有料化するので、Webhooks/LINE Notify連携レシピの代替をAWSで検討する

概要


IFTTTのWebhook+LINE Notify連携の代替として、AWS API Gateway + Lambdaの動作を確認した。



背景と目的


IFTTTが2020年10月6日に有料化するらしい。無料枠が少しだけあるのだが、私の場合そこに収まり切らないので、代替が難しそうなレシピを無料枠に充て、他のものはIFTTTより安く実現できる代替手段を検討している。

最近作成した自動水やり器では、

Webhookチャンネルでデータを受けて、LINEチャンネルでLINEのトークルームに結果通知するレシピ

を使っているが、AWSAPI Gateway+Lambdaに変更できそうに思えるので、ちょっと試しにやってみる。この組み合わせだと、使用規模次第で無料枠に収まる。Microsoft Flowも当然候補だが、すでにAWS使っちゃってるので優先で。


詳細


1. LINE NotifyのAPI

ちょっと調べただけで、

qiita.com

など、たくさんの情報が出てきた。Notifyでトークルームに送信できるAPIが用意されているらしい。とりあえず、上記の例はNode.jsだが、ここではPythonスクリプトを書いて試す。

1.1 トークンの取得

LINE NotifyのAPIをたたくには、LINE NotifyのWebサイトにログインして、トークンの取得が必要。トークルームごとにトークンを取得する必要があるようだ。というわけで、以下のボタンを押して表示されたものをメモ。なお、トークンごとに識別名を任意に与えられるらしく、送信時にメッセージの先頭につくらしい。


2 試しに送信

以下を作成。tokenとmessageは外から与える想定。下の方に、試しに動かすコード。

# coding: utf-8

import requests
import json

def post_LINE_Notify(token, params):

    URL = "https://notify-api.line.me/api/notify"
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Bearer %s" % token
    }
    response = requests.post(URL, data=params, headers=headers)
    ret = {
        "response": json.loads(response.text)
    }
    
    return ret


if __name__ == "__main__":

    token = "取得したトークン"
    params = {
        "message": "これはテストです。" # paramsの中身は、https://notify-bot.line.me/doc/ja/ 参照
    }
    ret = post_LINE_Notify(token, params)
    print(ret)

printした結果は、以下の通り。ステータスコード200が返ってきた。

{'response': {'status': 200, 'message': 'ok'}}

一方、LINEの画面は以下の通り。ちゃんと受信している。 園芸IoTという部分は、トークンを取得する際に、識別名として与えたもの。(自動水やり器の通知用トークルームに送信するのでこんな名前)


3. APIGateway + Lambda

3.1 APIGateway

IFTTTと同じ感じにするため、APIのリソースに、{event}というパスパラメータを用意。 リクエスト統合のapplication/jsonマッピングテンプレートでメソッドリクエストのパススルーを使った場合、Lambdaのevent引数のevent.path.eventに入ってくれる。 (AWSでやるなら、別に互換性持たせずむしろもっといろいろできる仕様にした方がいいかもしれないが)


3.2 Lambda

IFTTTでは、本文のJSONでvalue1,2,3を受け取り、パスパラメータでevent名を受け取って、LINE Notify本文を構成する。ここではテストなので、とりあえずパラメータを全部流す。

def lambda_handler(event, context):
    
    token = "取得したトークン"
    params = {
        "message": "event=%s\nvalue1=%s\nvalue2=%s\nvalue3=%s" % \
            (event["params"]["path"]["event"], 
            event["body-json"]["value1"],
            event["body-json"]["value2"],
            event["body-json"]["value3"])
    }
    # 送信
    ret = post_LINE_Notify(token, params)
    
    return ret


3.3 試し実行

LINEの方も、正しく受信できた。

というわけで、一応、API GatewayとLambdaで置き換えできそう。ノンプログラミング環境からの乗り換えにはなるが、発展性があるのでよしとする。


まとめと今後の課題


IFTTTのWebhook+LINE Notify連携の代替として、AWS API Gateway + Lambdaの動作を確認できた。こちらに置き換えようと思う。