そういえば、Lambda から外部APIを呼んだことがないなーと思ったので、実装方法をまとめてみました。bitFlyer の Public API 利用させていただき、最終取引の1BTC単価を取得する例を題材としました。久しぶりにマネージメントコンソールで Lambda を作成したので、GUIの変わりっぷりにびっくりしました。
この記事でできるようになることは下記の通りです。
- Python の
requests
モジュールを利用した API コールができるようになります。 - 外部モジュールを用いる際の Lambda ファンクションのデプロイ方法がわかるようになります。
- (おまけ)各取引所の最終取引価格を取得する API の利用方法が分かるようになります。
それでは始めていきます。
※ AWS Lambda Advent Calendar 2017 - Qiita の18日目が空きになってしまいそうなので、12月半ばに書いたこちらの記事を紐付けさせていただきました。
事前準備
作業ディレクトリ作成
今回は、ローカルで python コードを作成したのち、zip 化して、Lambda のモジュールとしてアップロードしていきます。まず、ローカル環境に作業ディレクトリを作ります。
$ mkdir lambda_coins $ cd lambda_coins
requests モジュールのインストール
続いて、Python から API 呼び出しをする際に利用する requests
モジュールをインストールします。
$ pip install requests -t ./ Downloading/unpacking requests Downloading requests-2.18.4-py2.py3-none-any.whl (88kB): 88kB downloaded Downloading/unpacking urllib3>=1.21.1,<1.23 (from requests) Downloading urllib3-1.22-py2.py3-none-any.whl (132kB): 132kB downloaded Downloading/unpacking certifi>=2017.4.17 (from requests) Downloading certifi-2017.11.5-py2.py3-none-any.whl (330kB): 330kB downloaded Downloading/unpacking chardet>=3.0.2,<3.1.0 (from requests) Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB): 133kB downloaded Downloading/unpacking idna>=2.5,<2.7 (from requests) Downloading idna-2.6-py2.py3-none-any.whl (56kB): 56kB downloaded Installing collected packages: requests, urllib3, certifi, chardet, idna Successfully installed requests urllib3 certifi chardet idna Cleaning up...
BTCの最終取引単価を取得するプログラムの作成
各取引所ごとにAPIを公開しているので、その API を利用させていただきます。この記事では、bitFlyer の例を中心に説明しますが、参考までに Zaif の場合、Coincheck の場合も載せておきます。
http://www.ketancho.net/entry/2017/12/01/000000
bitFlyerの場合
vim bf_btc_last.py
import requests def lambda_handler(event, context): bf_res = requests.get("https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY") return bf_res.json()["ltp"]
(参考)Zaif の場合
import requests def lambda_handler(event, context): bf_res = requests.get("https://api.zaif.jp/api/1/ticker/btc_jpy") return bf_res.json()["last"]
(参考)Coincheck の場合
import requests def lambda_handler(event, context): bf_res = requests.get("https://coincheck.com/api/ticker") return bf_res.json()["last"]
モジュールをアップロードする
外部モジュール requests
を使っているため、zip 化したモジュールをアップロードする必要があります。まず、zip ファイルを作成します。
$ zip -r lambda_coins.zip ./
次に、AWS コンソールで Lambda ファンクションを作成していきます。下記の Lambda の画面から「関数の作成」としてください。
「一から作成」を選択し、詳細の設定をしていきます。ロールについては今回は何もなくてよいのですが、S3へのアクセス権限を付与しておきました。(本当はいらない権限は付けてはダメです。)
モジュールをアップロードします。ハンドラ名を、 (pythonファイル名).(main関数名)
にするのを忘れないようにしてください。
テストイベントは、今回は何も引数を渡さないので標準のままでOKです。
保存&テストをすると、最新のビットコイン取引価格が取れると思います。196万円。いやー上がりましたね。。。
今後のやりたいこと
分かってはいたのですが、マネージメントコンソールから Lambda ファンクションを作るのは辛いですね。Serverless F/W 化 or SAM 化する例を次は書きたいと思います。そういえば、外部モジュール&Serverless F/W のコンビを利用したこともないな。。
また、Step Functions と組み合わせて、各取引所の価格をゴニョゴニョする簡単な仕組みも作りたいと思っています。(※作りました↓)