クラウドサービスAWSのLambdaを使って、天気予報を毎朝Lineに通知する仕組みを作る

今回はサーバーレスの一環として、天気予報を毎朝自分のLine宛に通知してもらう仕組みを作ります。難しい内容ではないので「サーバーレス」の概要を知るいいきっかけとしていただけたらと思います。


目次

  1. 事前準備
  2. 構成
  3. python準備
  4. Lambda設定と実行
  5. まとめ

1. 事前準備

事前準備として、以下を用意します。

 ①AWSアカウント

  アカウントがない方は以下を参考に作成ください。

 ②Line Notifyを利用できるようにする

  利用方法については、以下を参考にしてください。

 ③Lineをインストールしたスマートフォン

  受けるものがないと、送信されたかどうかよくわかりませんので。


2. 構成

今回利用する構成は以下の通りです。

AWSのサービスである「CloudWatchイベント」をトリガーとして、Lambdaにて天気情報をlivedoorから取得するコードを実行、実行結果をLine Notifyに通知します。


3. python準備

では早速コードの準備をしましょう。今回利用するコードは以下の通りとなります。

「otenki_funciton.py」として保存してください。 ※文字コードはUTF-8で保存を!

保存したファイルを、zipファイルで圧縮してください。
(ファイルを右クリック→送る→圧縮(zip形式)フォルダー選択)

# -*- coding: utf-8 -*-

import json
import sys
import urllib.parse
import urllib.request

#live doorの天気情報サイト
tenki_url="http://weather.livedoor.com/forecast/webservice/json/v1?city=%s"
locate="130010" # 場所は東京

#2日分の情報取得のための変数セット
kyo=0
asita=1

# Line通知用の設定
token="XXXXXXXXXXXXXXXXXXXXXXXXXXX"
line_url="https://notify-api.line.me/api/notify"

#ここからスタート
def lambda_handler(event, context):
    tenki_json = get_tenki()
    for day in [kyo, asita]:
        msg = set_tenki(tenki_json, day)
        send_tenki(msg)

#天気情報取得
def get_tenki():
    try:
        url = tenki_url % locate
        html = urllib.request.urlopen(url)
        html_json = json.loads(html.read().decode('utf-8'))
    except Exception as r:
        print ("Exception Error: ", r)
        sys.exit(1)
    return html_json

#通知内容整形
def set_tenki(tenki_json, day):
    min_temp = None
    max_temp = None
    try:
        date = tenki_json['forecasts'][day]['date']
        tenki = tenki_json['forecasts'][day]['telop']
        max_temp = tenki_json['forecasts'][day]['temperature']['max']['celsius']
        min_temp = tenki_json['forecasts'][day]['temperature']['min']['celsius']
    except TypeError:
        # temperature data is None etc...
        pass
    msg = "%s\nお天気: %s\n最低気温: %s\n最高気温: %s" % \
               (date, tenki, min_temp, max_temp)
    return msg

#天気情報の送付
def send_tenki(msg):
    method = "POST"
    headers = {"Authorization": "Bearer %s" % token}
    payload = {"message": msg}
    try:
        payload = urllib.parse.urlencode(payload).encode("utf-8")
        req = urllib.request.Request(
            url=line_url, data=payload, method=method, headers=headers)
        urllib.request.urlopen(req)
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)


if __name__ == '__main__':
    main()


4. Lambda設定と実行

それではAWS側の設定となります。まずはLambdaの設定を実施します。

「サービス」→「Lambda」から「関数の作成」を選択します。

以下の通り情報を入力し、一番下にある「関数を作成」を選択します。

 ・「一から作成」を選択
 ・関数名:otenki-get(ここは自由に設定を)
 ・ランタイム:Python 3.8
 ・実行ロール:特に変更はしない

以下画面が表示されれば完成です。早速コードをアップロードしましょう。

画面を下へスクロールすると、「アクション」メニューが見えるので「.zipファイルをアップロード」を選択して先ほどZIP化したファイルをアップロードします。

アップロードが完了したら、さらに下へスクロールして「基本設定」の「編集」を選択してハンドラを
 「otenki_function.lambda_handler」に設定します。

次にテストをするために、「テスト」を選択し以下を設定したら「作成」を選択します。

 ・新しいテストイベントの作成を選択
 ・イベントテンプレート:hello-world
 ・イベント名:test

あとはもう一度「テスト」を選択すればコードが実行されて、自身のLineに今日・明日分の天気予報と最高気温・最低気温が通知されます。

では最後に、毎朝実行してもらうようCloudWatchイベントにルールを作成します。

「サービス」→「CloudWatch」→「ルール」→「ルールの作成」を選択以下の通り設定「設定の詳細」を選択します。ここでCronの時間はGMTなので、設定した時間の9時間後に実行されることになります。今回は朝の6時に実行させるので、21時0分として設定しています。

 ・スケジュールにチェック
 ・Cron式にチェックし、「0 21 * * ? *」を設定
 ・ターゲット:Lambda関数を選択、先ほど作成した関数「otenki-get」を選択

あとはルール名と説明を適当に入力して、「ルール作成」にて完了です。

Lambda関数画面は、以下の通りになっているはずです。これで、毎朝6時に天気予報が通知されます。


5. まとめ

いかがだったでしょうか。サーバーを利用せずコードを実行させることができました。

今回は天気予報を通知する設定でしたが、色々と応用的に使うことが多いと思いますので覚えておいて損はないと思います。

最後まで読んでいただき、ありがとうございました。


返信を残す

メールアドレスが公開されることはありません。

CAPTCHA