【AWS】lineにメッセージを送る方法のまとめ(lambdaの使用)

はじめに

こんにちは。
みなさまLineって使ってますか?私はLineを使い始めたのは大学2年くらいの頃でかれこれ10年くらい使っています。
高校の頃、友人や家族と連絡を取ると言ったら、電話以外ですと「メール」が主流でした。

ガラケーでぽちぽちメールをしてたのを思い起こすと懐かしさを感じます。
ガラケーのメールはPOPプロトコルで、携帯端末に保存する仕組みでした。メールの保存上限もあるため、大事なメールは大切に保管して・・・と言ったこともしてましたが、センチメンタルな行動だったたなーと思いキュンキュンします。


話は変わり、今ではそんなメールに変わりコミュニケーションツールの「Line」が主流になってるのかなと思います。
海外事情はよくわかりませんが、私の周りの方と連絡を取ると言ったらこのLineを通じてコミュニケートすることになります。
電話も無料でできちゃうので手放せないですよね。

さて、それなりにLineが普及しているわけですが、そんな中でもこのLineを使っていないユーザもいるかと思います(決して悪いといっているわけではないです!)。
そう言った方とは私のgmailなどのフリーメールに連絡を送ってもらっているわけですが、私はメールをメインにコミュニケートをすることはないので通知を見落としがちです。
→メルマガに埋もれてしまう・・・

そこで、今回はそんなLineをしていない方からにも、私のlineにメッセージを送ることを可能とする仕組みを模索しました。
自身のスキルアップも兼ねAWSなどのサービスを用いることにしましたので、そこで身に付けたことを本記事にまとめようと思います。

作るものの概要

 今回は「Line notify」AWS「lambda」、「レイヤー」の機能を使用します。
 Line notifyで「Line上でメッセージ送信したい相手に対するトークン」を発行し、そのトークンを用いてメッセージを送信するコードをlambdaに実装します。

 今回はここまでの機能のみをまとめますが、今後はAWSの「APIゲートウェイ」も利用し、webアプリを通じてlambdaを叩くような仕組みも実装したいと考えてます。

使用する機能一覧

Line notify

  • 概要

 webサービスからの通知をlineに通知するサービス

  • 今回の使用用途

 Lineで送りたい「個人」、「グループ」に対するトークを発行する。

AWS

Lambda
  • 概念

 EC2などのリソースを※プロビジョニングしなくても、ソースを実行できるサービス

 ※プロビジョニング:必要に応じてネットワークやコンピュータのリソースを予測し準備しておくこと

  • 今回の使用用途

 今回はpythonを選定し、pythonからline notifyで発行したトークンに対してメッセージを発信する。
 →数行でコーディングできて簡単!

レイヤー
  • 概念

 lambdaで選定した言語に対して、外部APIを設定することのできるサービス

  • 今回の使用用途

 pythonからLineに通知する際に「requests」モジュールが必要であるため、レイヤーに「requests」モジュールを設定することでlambdaから呼び出せるようにする。

作業手順

Line notify

 以下、line notifyのサイトにて通知を送りたい相手(グループ、個人)に対して、1対となるトークンを発行する
 https://notify-bot.line.me/ja/

 ★Line notifyは自身のlineアカウント(メールアドレス)にて、ログイン可能
 ★トークンは外部に公開しないこと!

  • テスト

 以下、curlコマンドを実行することで、Lineにメッセージを送信する。

curl -X POST -H 'Authorization: Bearer __YOUR_TOKEN__' -F "message=Hello!" https://notify-api.line.me/api/notify

AWS

Lambda
  1. AWSにて、lambda関数(python)を生成する
  2. 以下コードを入力し、デプロイする
import os
import requests

# Line Notify
ACCESS_TOKEN = os.environ["access_token"]
HEADERS = {"Authorization": "Bearer %s" % ACCESS_TOKEN}
URL = "https://notify-api.line.me/api/notify"

def lambda_handler(event, context):
    data = {'message': "send_test"}
    #lineに通知
    requests.post(URL, headers=HEADERS, data=data)
レイヤー
  • 以下の手順でレイヤーに設定する。

1. 事前に上記のモジュールをダウンロード・zip化する(python環境の構築方法は省略する)

pip install hoge
mkdir hoge
pip install -t ./hoge hoge
zip -r hoge.zip hoge

2. AWS上にて、任意のレイヤーを作成する
3. 2.に1.のzip化したデータをアップロードする(lambdaからimport可能となる)
4. lambdaで作成した関数に対して2.のレイヤーを紐付ける
 (AWSのlambdaページを開き)lambda→関数→(自分の作成した関数名)→設定→デザイナー(layers(0)を選択)
 
 上記を選択した後に登場する「レイヤー」フォームにて「レイヤーの追加」を選択し、今回作成したレイヤーを追加する

  • 注意事項

レイヤーにアップロードするzipは、以下構造を満たしてないとlambdaからimportできません!

pillow.zip 
| python/PIL 
└ python/Pillow-5.3.0.dist-info

 参考
docs.aws.amazon.com

最後に

ここまでやってみたら、lambdaのテストを実行することでlineに通知を飛ばせるようになるはずです。

私は、レイヤーからのimportがうまくできなくて数時間詰まってました。
zip化したファイルの中身の所有権も疑ってたりしましたが、公式のdocを見たらすぐに解決しました。
→やっぱ公式ドキュメントを読み込むことは大事と言うことですね

今回はlambdaを直接動かしてましたが、次回はAPIゲートウェイも用いてwebアプリから本機能を叩くことができるようにしたいと思います。


ここまで読んでいただきありがとうございました!