AWS Lambda から外部 API を呼び出す

 そういえば、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 の画面から「関数の作成」としてください。

f:id:ketancho_jp:20171213030506p:plain

「一から作成」を選択し、詳細の設定をしていきます。ロールについては今回は何もなくてよいのですが、S3へのアクセス権限を付与しておきました。(本当はいらない権限は付けてはダメです。)

f:id:ketancho_jp:20171213030513p:plain

モジュールをアップロードします。ハンドラ名を、 (pythonファイル名).(main関数名) にするのを忘れないようにしてください。

f:id:ketancho_jp:20171213030555p:plain

テストイベントは、今回は何も引数を渡さないので標準のままでOKです。

f:id:ketancho_jp:20171213030536p:plain

保存&テストをすると、最新のビットコイン取引価格が取れると思います。196万円。いやー上がりましたね。。。

f:id:ketancho_jp:20171213030558p:plain

今後のやりたいこと

 分かってはいたのですが、マネージメントコンソールから Lambda ファンクションを作るのは辛いですね。Serverless F/W 化 or SAM 化する例を次は書きたいと思います。そういえば、外部モジュール&Serverless F/W のコンビを利用したこともないな。。

 また、Step Functions と組み合わせて、各取引所の価格をゴニョゴニョする簡単な仕組みも作りたいと思っています。(※作りました↓)

www.ketancho.net