【AWS】Lambda, IFTTTで天気通知システムの製作

aws_logoAWS

この記事の内容

この記事では、以下のサービスを使用して、毎日決まった時間に、明日の天気と最低気温および最高気温を通知するシステムを製作する流れを記載します。

使用するサービス

  • AWS Lambda
  • AWS CloudWatch
  • Weather Hacks(REST API)
  • IFTTT

このシステムを構築することで以下を学ぶことができます。

  • AWS Lambdaの基本的な使い方
  • AWS CloudWatchの基本的な使い方
  • PythonでREST APIを呼び出す方法
  • IFTTTを使用して、WebhooksおよびNotificationsを使用する方法

難しい内容ではなく、基本的な上記の内容について学べるので、手を動かして行うとより理解が深まると思いますので、良ければ構築してみてください。

システム構成

システム構成は以下の通りです。

【AWS】Lambda,-IFTTTで天気通知システムの製作_システム構成図

順に説明します。

No.概要
1指定した時間にLambdaを呼び出します。cronで時間を指定します。
2Weather Hacks提供している、REST APIを呼び出し、天気情報を取得します。(JSON形式)
3IFTTTのトリガーであるWebhooksを呼び出します。呼び出す情報の中に、JSON形式で、明日の天気、最低気温、最高気温の情報渡します。
4IFTTTのアクションである、Notificationsを呼び出します。通知情報には、No.3の情報を含めます。
5IFTTTのNotificationsの機能でスマホ通知を行います。
6任意項目ですが、スマホとスマートウォッチをBluetooth接続し、スマホのIFTTTの通知をスマートウォッチへ通知します。(xiaomi mi band 4で動作確認しました)

次に簡単に使用するサービスについての解説を行います。

使用するサービス

AWS Lambda

AWS Lambdaは、サーバレスでイベントを自動実行する仕組みになります。処理のための専用サーバが必要なく、必要なイベントに応じて自動実行されます。プログラム実行の時間に応じて課金がされるサービスとなります。Java, C#, Ruby, Pythonといった様々な言語で処理を記述することができます。Lambdaは様々なイベントで呼び出すことができ、例えばS3バケットにデータが格納された場合にLambdaを呼び出すなどが可能になります。

Weather Hacks

お天気Webサービス(Livedoor Weather Web Service / LWWS)は、現在全国142カ所の今日・明日・あさっての天気予報・予想気温と都道府県の天気概況情報を提供しています。

QAに記載がありますが、商用利用に関しては使用できませんのでご注意ください。

livedoor
株式会社ライブドアが運営するポータルサイト。速報性に加え独自の切り口を誇る「ライブドアニュース」、日本最大のブログサービス「ライブドアブログ」ほか、厳選した情報をお届けします。

API仕様

livedoor
株式会社ライブドアが運営するポータルサイト。速報性に加え独自の切り口を誇る「ライブドアニュース」、日本最大のブログサービス「ライブドアブログ」ほか、厳選した情報をお届けします。

IFTTT

IFTTTは、様々なサービス(LINEやTwitter)を連携させるWebサービスです。

IFTTTは、「IF This Then That」の頭文字を表し、「もし、これをしたら、あれをする」という意味があります。

例えば、以下のようなことが可能になります。

  • 「Twitterでつぶやいたら」→「スマホに通知」
  • 「家に近づいたら」→「LINEで通知」

無料で使用することができ、iOS, Android, PCのアプリで使用することができます。

IFTTT - Automate business & home
Get started with IFTTT, the easiest way to automate your favorite apps and devices for free. Make your home more relaxing. Make your work more productive. We...

システム構築手順

IFTTTの設定

IFTTTのアプリをインストールします。(AppleStoreやPlayストアにて)

ここでは、Androidのアプリを例に説明していきます。まずは、IFTTTにて、アプレットを作成します。

IFTTTのアプリを起動し、Get moreをタップします。

IFTTT_01

 

 

 

 

 

 

 

 

 

をタップします。

IFTTT_02

 

 

 

 

 

 

 

 

 

Thisをタップします。ここにトリガーとなるWebhooksを設定していくことになります。

IFTTT_03

 

 

 

 

 

 

 

 

 

トリガーにはWebhooksを指定します。検索窓にwebと入力して、Webhooksが出てきたらタップをしてください。

IFTTT_04

 

 

 

 

 

 

 

 

 

 

Receive a web request をタップしてください。

IFTTT_05

Event Nameに「weather_info_recieved」と入力します。その後、Continueをタップします。

このイベント名は、Webhooksを呼び出すための識別名となります。

 

 

 

 

 

 

 

 

 

 

 

Thisは設定できましたので、次はThat部分である、Notificationsを設定していきます。Notificationsをタップします。

IFTTT_07

 

 

 

 

 

 

 

 

 

 

 

Send a notification from the IFTTT appをタップします。

IFTTT_08

 

 

 

 

 

 

 

 

 

 

 

 

Message内に、以下の内容で入力します。この内容が実際にスマホやスマートウォッチに通知される内容になります。Value1には天気、Value2には最低気温、Value3には最高気温が入ります。この設定は、AWSのLambda側で設定を行います。Value1~Value3の入力をするには、Insert ingredientsをタップして入力します。入力が完了したら、Continueをタップします。

 

 

 

 

 

 

 

 

 

 

 

 

設定が完了したら、Finishをタップします。

IFTTT_10

 

 

 

 

 

 

 

 

 

 

 

 

AWS LambdaでWebhooksを呼び出すためのURLを確認します。確認するためには、WebhooksのページのDocumentationをタップします。

IFTTT_11

 

 

 

 

 

 

 

 

 

 

 

 

以下の赤枠内のURLを控えます。{event}となっている箇所は、Webhooksで指定した「weather_info_recieved」に置き換えます。これにて、IFTTTの設定は完了です。もしスマートウォッチ側の設定を行う場合は、各種スマートウォッチの設定方法に応じて、IFTTTの通知を受け取るように設定をしてください。

IFTTT_12

 

 

 

 

 

 

 

 

 

 

 

 

AWSの設定

AWSのページより、AWS Lambdaのページを開きます。関数の作成をクリックします。

AWS_Lambda_構築_01

一から作成を選択します。関数名には「requestWeatherInfoNotification」を指定します。ランタイムは、Python 3.7を指定します。実行ロールは、「基本的なLambdaアクセス権限で新しいロールを作成」を選択し、関数の作成をクリックします。

AWS_Lambda_構築_02

REST APIを使用するために、Pythonのrequestsモジュールが必要ですが、Lambda上に配置されていないため配置する必要があります。配置するには、ディレクトリを作成し、そのディレクトリに移動した状態で以下のコマンドを実行します。

pip installrequests -t ./

上記のコマンドを入力すると、requestsモジュールがディレクトリ内に格納されます。*.dist-infoとbinは必要無いので削除してください。

AWS_Lambda_構築_03

削除すると以下の状態になると思います。この状態で、ディレクトリをzip形式に圧縮してください。

AWS_Lambda_構築_04

AWSのページに戻り、コードエントリタイプに「.zipファイルをアップロード」を指定し、アップロードボタンをクリックします。そして、先ほど圧縮したzipファイルを選択します。選択後、右上の保存ボタンをクリックしてください。これで、requestsモジュールのファイルがLambda上にアップロードされます。

AWS_Lambda_構築_05

アップロード完了後、以下の構成になっていれば問題ありません。なっていない場合は、以下の構成になるようにディレクトリの移動など行ってください。

AWS_Lambda_構築_06

上記のディレクトリ構成になったところで、以下のコードをlambda_function.pyに記載してください。IFTTT_WEB_HOOK_URL には、IFTTTのWebhooksのページで確認したURLを記載してください。また、必要に応じて、WEATHER_HACKS_REQUEST_URLのcityは変更してください。(サンプルでは名古屋市を設定)

import json
import requests

# 天気情報を保持するクラス
class WeatherInfo:
    def __init__(self, weather, min_temperature, max_temperature):
        self.__weather = weather
        self.__min_temperature = min_temperature
        self.__max_temperature = max_temperature

    @property
    def weather(self):
        return self.__weather
        
    @property
    def min_temperature(self):
        return self.__min_temperature
        
    @property
    def max_temperature(self):
        return self.__max_temperature

# 明日の天気情報を取得する
def get_next_day_weather_info():
    
    # Weather HacksのREST APIを呼び出し、天気情報を取得(cityは名古屋市を指定)
    WEATHER_HACKS_REQUEST_URL = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=230010'
    whather_json = requests.get(WEATHER_HACKS_REQUEST_URL).json()
    
    # 明日の天気情報を抜き出す
    next_day_weather_json = whather_json['forecasts'][1]
    
    # 天気、最低気温、最高気温を取り出す
    weather = next_day_weather_json['telop']
    min_temperature = next_day_weather_json['temperature']['min']['celsius']
    max_temperature = next_day_weather_json['temperature']['max']['celsius']
    weatherInfo = WeatherInfo(weather, min_temperature, max_temperature)
    
    return weatherInfo
    
# 天気情報の通知リクエスト送信
def request_weather_info_notification(weather_info):
    
    # 天気情報の通知リクエスト送信先
    IFTTT_WEB_HOOK_URL = 'ここにIFTTTのURLを設定'
    
    # IFTTTのWebHook先へリクエスト送信(POST)
    json_data = {
    "value1": weather_info.weather,
    "value2": str(weather_info.min_temperature),
    "value3": str(weather_info.max_temperature)
    }
    
    headers = {"Content-Type" : "application/json"}
    requests.post(IFTTT_WEB_HOOK_URL, data=json.dumps(json_data), headers=headers)
    
# Lambdaのハンドラ
def lambda_handler(event, context):
    weather_info = get_next_day_weather_info()
    request_weather_info_notification(weather_info)
    
    return { 'statusCode': 200 }

ここで、一度IFTTTと連携が取れるかテストを行います。AWSのTestをクリックし、テストイベントの設定を行います。以下の内容で入力して設定します。この状態で、Testをクリックして、スマホに通知されれば問題ありません。IFTTTはリアルタイム性はそこまでないので多少のタイムラグはあります。
AWS_Lambda_構築_07

ここまで問題なければ、次に指定した時間にLambdaを呼び出す設定を行います。Lambdaの以下のページで、「+トリガーを追加」ボタンをクリックします。

AWS_Lambda_構築_08

トリガーの種類に、「CloudWatch Events/EventBridge」を選択します。ルールは「新規ルールの作成」を選択します。ルール名は任意でかまいません。ルールタイプはスケジュール式を選択します。スケジュール式はcron(0 11 ? * * *)を入力します。これは毎日20時にトリガーを発火させるという意味になります。11が時間を示すのですが、ここではUTC時間で入力する必要があります。日本時間になおすためには、日本時間はUTC時間より9時間進んでいるため、20時 – 9時間 = 11を指定しています。入力が完了したら、右下の追加をクリックします。

AWS_Lambda_構築_09

以上で設定は完了です。うまくいくと、スマホとスマートウォッチには以下のような形で通知が表示されます。

phone_notifications

miband_notifications

 

 

 

 

 

 

 

 

 

 

 

 

 

まとめ

以下のサービスを使用して、毎日、明日の天気や気温を表示するシステムを構築する手順を解説しました。

  • AWS Lambda
  • AWS CloudWatch
  • Weather Hacks(REST API)
  • IFTTT

このシンプルなシステムをハンズオンなどで構築することでREST APIやAWS Lambdaの使い方の流れがわかるようになるかと思いますので、是非ご利用ください。

コメント