やりたいこと
Lambdaから外部のAPIを使用して、データを取得してみました。
以下の記事を参考にさせていただきました。(今回はOpenWeatherの外部APIを使用しました)
qiita.com
またLambdaから実行する上でPythonのrequestsモジュールを使用するので、以下を参考にLayer化しました。
作業内容
openweathermap.org
サインインする画面が出てきますので、ページ中央の「Create an Account.」を押下します。
最低限必要な項目を入力orチェックして「Create Account」ボタンを押下します。
無事に作成できたらサインインして、ページ上部の「Hello <自分の登録名>」を押下します。
すると以下のような画面が出ると思いますので、「API keys」タブを押下して自分のAPI Keyを確認します。
デフォルトのKeyを使用しても良いですが、今回はCreate keyからもう一つkeyを作成して使用します。
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の環境変数で持つようにしています。(今回は東京を指定)
Lambdaまでできたので、いざ実行といきたいとことですが、現時点ではまだ天気情報は取得できません。
原因はインポートしている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に登録をします。
Layersに追加されていることを確認します。
Lambdaからデータ取得
先ほど追加したLeyerをLambdaに設定します。
DesignerのLayersを押下して、レイヤーの追加からrequests_moduleレイヤーを選択・追加します。
無事にLeyerが追加できたらLambdaを実行してデータが取得されるかを確認します。
”Rain”とあるので、今の東京は雨が降っていることがわかります。
結論やわかったこと
今回は外部APIからデータを取得するのはSlackのbot作成時に既に実装したことがあったので、特段何か詰まるということはなかったです。
botはGoogle Apps Scriptで実装したのですが、同じSaaSでも大分使いやすさが違いました。
個人的にはLambdaのほうが好きですが、お金をかけたくないということであればGASを使用したほうがよいかもしれません。
(といってもLambdaもそこまで高額な料金がかかるというわけではないですが)
GASの記事はいつか気が向いたら書きます笑