カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

Lambdaを使用してOpenWeatherMapから情報を取得する

やりたいこと

Lambdaから外部のAPIを使用して、データを取得してみました。

以下の記事を参考にさせていただきました。(今回はOpenWeatherの外部APIを使用しました)

qiita.com
またLambdaから実行する上でPythonのrequestsモジュールを使用するので、以下を参考にLayer化しました。

qiita.com

作業内容

  • API Keyの取得
  • Lambdaの作成
  • requestsモジュールのLeyer化
  • Lambdaからデータ取得

    実際に行った事

    API Keyの取得

    まずは外部APIのキーを取得するため以下URLにアクセスし、ページ上部にあるSign Inを押下します。

openweathermap.org

サインインする画面が出てきますので、ページ中央の「Create an Account.」を押下します。

f:id:live-your-life-dd18:20191011102049p:plain

最低限必要な項目を入力orチェックして「Create Account」ボタンを押下します。

f:id:live-your-life-dd18:20191011102216p:plain

無事に作成できたらサインインして、ページ上部の「Hello <自分の登録名>」を押下します。
すると以下のような画面が出ると思いますので、「API keys」タブを押下して自分のAPI Keyを確認します。

f:id:live-your-life-dd18:20191011102559p:plain

デフォルトのKeyを使用しても良いですが、今回はCreate keyからもう一つkeyを作成して使用します。

f:id:live-your-life-dd18:20191011102750p:plain

Lambdaの作成

次にLambdaを作成します。
ロールはLambdaを実行するために最低限のもの、ランタイムはPython3.7で作成しました。
コード自体は本記事冒頭の参考記事のコードに少し手を加えました。

import requests
import os
import json

CITY_NAME = os.environ['CITY_NAME']
API_KEY = os.environ['API_KEY']

def get_wether(event):
    api = "http://api.openweathermap.org/data/2.5/weather?units=metric&q={}&APPID={}".format(CITY_NAME,API_KEY)

    url = api.format(city = CITY_NAME, key = API_KEY)
    response = requests.get(url)
    data = response.json()
    jsonText = json.dumps(data, indent=4)
    print(jsonText)

def lambda_handler(event, context):
    # TODO implement
    get_wether(event)



取得したい地域とAPIキーはLambdaの環境変数で持つようにしています。(今回は東京を指定)

f:id:live-your-life-dd18:20191011103408p:plain

Lambdaまでできたので、いざ実行といきたいとことですが、現時点ではまだ天気情報は取得できません。

f:id:live-your-life-dd18:20191011103550p:plain

原因はインポートしているrequestsモジュールがpythonの外部モジュールのため、デフォルトでは提供されていません。
そのため外部モジュールをLambdaのLayerに設定して、使用できるようにします。

requestsモジュールのLeyer化

requestsモジュールのLayer化はpipを使用して行います。
また、pythonのvenvを使用して仮想環境上で作業します。

まずはPowerShellを立ち上げて、venvの作成・アクティベートをします。
※必要であれば「python -m pip install --upgrade pip」でpipのアップグレードも併せて実施します。

PS C:\work\openweather>
PS C:\work\openweather> python -m venv venv_openweather
PS C:\work\openweather> cd .\venv_openweather\
PS C:\work\openweather\venv_openweather> .\Scripts\activate
(venv_openweather) PS C:\work\openweather\venv_openweather>



そこまでできたら、LambdaのLayer化するためにpythonフォルダを作成し、その配下にrequestsモジュールをインストールします。

(venv_openweather) PS C:\work\openweather\venv_openweather> mkdir python
(venv_openweather) PS C:\work\openweather\venv_openweather> cd .\python\
(venv_openweather) PS C:\work\openweather\venv_openweather\python> pip install requests -t ./
(venv_openweather) PS C:\work\openweather\venv_openweather\python> dir
    ディレクトリ: C:\work\openweather\venv_openweather\python
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/10/11     10:47                bin
d-----       2019/10/11     10:47                certifi
d-----       2019/10/11     10:47                certifi-2019.9.11.dist-info
d-----       2019/10/11     10:47                chardet
d-----       2019/10/11     10:47                chardet-3.0.4.dist-info
d-----       2019/10/11     10:47                idna
d-----       2019/10/11     10:47                idna-2.8.dist-info
d-----       2019/10/11     10:47                requests
d-----       2019/10/11     10:47                requests-2.22.0.dist-info
d-----       2019/10/11     10:47                urllib3
d-----       2019/10/11     10:47                urllib3-1.25.6.dist-info

※インストールされたフォルダのうちbinと*.dist-infoのフォルダは削除しておきます。

フォルダの整理ができたら、圧縮ファイルを作成します。
この時pythonフォルダごと圧縮するので、間違えないように気を付ける必要があります。

(venv_openweather) PS C:\work\openweather\venv_openweather> Compress-Archive -Path .\python\ -DestinationPath .\requests.zip
(venv_openweather) PS C:\work\openweather\venv_openweather> dir
    ディレクトリ: C:\work\openweather\venv_openweather
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/10/11     10:42                Include
d-----       2019/10/11     10:42                Lib
d-----       2019/10/11     10:52                python
d-----       2019/10/11     10:45                Scripts
-a----       2019/10/11     10:42            123 pyvenv.cfg
-a----       2019/10/11     10:54         858140 requests.zip



圧縮ファイルまでできたら、LambdaのLayerに登録をします。

f:id:live-your-life-dd18:20191011105820p:plain

Layersに追加されていることを確認します。

f:id:live-your-life-dd18:20191011105900p:plain

Lambdaからデータ取得

先ほど追加したLeyerをLambdaに設定します。
DesignerのLayersを押下して、レイヤーの追加からrequests_moduleレイヤーを選択・追加します。

f:id:live-your-life-dd18:20191011110059p:plain f:id:live-your-life-dd18:20191011110224p:plain f:id:live-your-life-dd18:20191011110257p:plain

無事にLeyerが追加できたらLambdaを実行してデータが取得されるかを確認します。

f:id:live-your-life-dd18:20191011110456p:plain

”Rain”とあるので、今の東京は雨が降っていることがわかります。


結論やわかったこと

今回は外部APIからデータを取得するのはSlackのbot作成時に既に実装したことがあったので、特段何か詰まるということはなかったです。
botGoogle Apps Scriptで実装したのですが、同じSaaSでも大分使いやすさが違いました。
個人的にはLambdaのほうが好きですが、お金をかけたくないということであればGASを使用したほうがよいかもしれません。
(といってもLambdaもそこまで高額な料金がかかるというわけではないですが)

GASの記事はいつか気が向いたら書きます笑