AWS LambdaからABEJA Platform上にデプロイしたHTTP Serviceで推論する方法です。
前提
ABEJA Platform上でHTTP Serviceを立てていること。
まだの場合は ABEJA Platform Advent Calendar 2018 を参考に立ててください。
概要
ABEJA Platformの推論は、ただ単にAPIに対してHTTPリクエスト投げるだけです。
今回はLambdaでPythonのrequestsを使って投げます。
手順
まず、LambdaでHTTPリクエストを投げるためにrequestsを導入します。
ローカルでrequestsをダウンロードします。
mkdir lambda_requests
cd lambda_requests
pip install requests -t ./
そしてLambda用のコードを書きます。
vim lambda_function.py
import json
import requests
# 今回はWeb上にある画像をそのまま使っています。
# Lambdaから利用する場合はS3などの画像を扱ったりするかと思います、
sample = "https://console.abeja.io/images/cat_thumb.jpg"
data = requests.get(sample).content
def lambda_handler(event, context):
url = "https://{}.api.abeja.io/deployments/{}".format(os.environ["ORGANIZATION_NAME"], os.environ["DEPLOYMENT_ID"])
user = "user-{}".format(os.environ["ABEJA-PLATFORM-USER"]
token = os.environ["PERSONAL-ACCESS-TOKEN"]
payload = data
headers = {
'Content-Type': 'image/jpeg',
}
r = requests.post(url, data=payload, auth=(user, token), headers=headers)
return r.text
"ORGANIZATION_NAME"、"DEPLOYMENT_ID"、"ABEJA-PLATFORM-USER"、"PERSONAL-ACCESS-TOKEN"はLambdaに設定した環境変数から呼び出すようにしています。
コードや操作が複雑になるのと連携の趣旨から外れるため記載していませんが、Tokenに関しては環境変数よりKMSに入れた方が安全です。
出来上がったら、zip化します。
zip -r lambda_function.zip ./
Lambdaの関数を作成の際に以下の通りに進めます。
- 関数の作成
- 一から作成
- 関数名: 好きな関数名
- ランタイム: Python2.x or Python3.x
- ロール: 権限は必要ないので適当なもの
- 関数コード
- 「zipファイルをアップロード」を選択し、先ほどのzipファイルをアップロード
- ハンドラ: lambda_function.lambda_handler
- 基本設定
- タイムアウト: 30秒ほど
- 環境変数
- "ORGANIZATION_NAME"、"DEPLOYMENT_ID"、"ABEJA-PLATFORM-USER"、"PERSONAL-ACCESS-TOKEN" を設定
完了
まとめ
たったこれだけで、LambdaからABEJA Platform上の推論APIを呼び出すことができます。
今回は画像でしたが、jsonでも少し書き換えれば実装可能です。
また、AWSを組み合わせると、S3にファイルが置かれたらLambdaを呼び出して推論APIに投げる。レスポンスをDynamoDBに書き込む。といったイベントドリブンアーキテクチャも作ることが可能です。
ぜひトライしてください。