イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです。ITトレンド・List Finderの開発をベースに、業務外での技術研究などもブログとして発信していってます!


このエントリーをはてなブックマークに追加

LINE Notifyが使いやすそうなので、Lambda(python)から何か通知させてみる

今回は、「世のマイクロサービスおじさんは皆大好きMartin Fowler大先生が定義した『設計償却線』を、事業としてやりたい理想視点&DDD的視点から実線算出提示してみんなが幸せになる」というカオスタイトルの記事を書く予定でしたが、 思えば自分の記事は毎回エモいのばっかりだなと気づきちょっと足踏みしていた塚本です。秋雨前線にはお気をつけください。

そんな昨日(10/13)LINE Engineer Blogにポストされた、 コマンドラインから LINE にメッセージを送れる LINE Notify という記事を読み、早速やってみたところ死ぬほど簡単だったので、たまには実践風のこちらを記事にすることにします。

まずコマンドラインで

上記LINEブログに書いてあるとおりです。(Tokenの取得を先にやっておく必要あり)

curl -X POST -H "Authorization: Bearer ***token***" -F "message=It works!!" https://notify-api.line.me/api/notify

これだけ。

LINE screenshot

せっかくなので、.bashrcにエイリアスを設定します。

function sendline (){
    curl -X POST -H "Authorization: Bearer ${LINENOTIFYTOKEN}" -F "message=$1" $LINENOTIFYHOST
}

環境変数を設定します。

export LINENOTIFYTOKEN=************
export LINENOTIFYHOST=https://notify-api.line.me/api/notify

叩く

sendline '動作確認やで!'
LINE screenshot

来ました!

遅まきながらここで気づいたのが、送信元が「LINE Notify」と表示されるので、私信には使いにくいということ。 明らかにシステム通知っぽいものしか用途にならないと思いそっち方面での用途について考えました。

とはいえ、既にSlackにどっぷり浸かっているため、システム通知を今更代替しようとも思わない。 とりあえず

「なんか目標達成したときにLINEに通知したりしたらいいんじゃないか」

と思いましたので、Lambdaで作ってみました。

AWS Lambdaで実装

AWS Lambdaは、ざっくり言ってしまうと「サーバ構築せずにスクリプトを実行できるAWSのマネージドサービス」です。 解説

IAMロールの設定は省きます

仮にデイリーの目標となる数値を取得できるAPIを実装していたとします。 (API_URL定数にGETリクエストで数値を取得可能とする)

Lambdaに上げたスクリプトは以下 今回は軽い処理なのでPython使います。

import urllib.parse
import pycurl

def get_point():
    API_URL='https://api.ourcompany.com/daily/point'
    curl = pycurl.Curl()
    curl.setopt(pycurl.URL, API_URL)
    return curl.perform()

def send_line(message):
    LINE_NOTIFY_URL = 'https://notify-api.line.me/api/notify'
    LINE_NOTIFY_TOKEN = '*****yourtoken*****'
    headers = { 'Authorization' : 'Bearer %s' % LINE_NOTIFY_TOKEN }
    data={'message': message}
    field_data = urllib.parse.urlencode(data)

    curl = pycurl.Curl()
    curl.setopt(pycurl.URL, LINE_NOTIFY_URL)
    curl.setopt(pycurlHTTPHEADER, ["%s: %s" % t for t in headers.items()])
    curl.setopt(pycurl.POSTFIELDS, field_data)
    curl.perform()

def lambda_handler():
    goal = 1000
    result = get_point()
    if result < goal:
        return False

    message = '本日 %s Point 達成しました!!' % result
    send_line(message)

まず手動で実行します。

LINE screenshot

来ました!

Lambdaのコンソール画面でスケジュール設定すれば、毎分でも確認に行ってくれます

※厳重注意このままのコードだと、目標達成後(喜びも束の間)毎分通知が飛び続けるという地獄が待っています。

というわけで、簡単(ここまで1時間弱)です。 Pythonやnode.jsの習熟度で若干差はありますが、言っても何時間もかからないと思います。

総括

SlackなどのChatツールを使っていない部門のメンバーに、システムからお知らせしたいことなどあればすぐ実装できますね。 (LINEを会社として使ってよいのかという大問題が据え置きですが、一旦既読スルーで)

サーバレス素敵です

ちなみに元記事にはムーンのウザスタンプをおくるやつが書いてますが、パラメータがURL指定となっており、どこでそれが分かるのかわかりません。

ご存じの方いらっしゃれば @hihatsまでお知らせいただければ喜んですみっコぐらしのスタンプをお送りします。

こちらからは以上です。