目標
前回のエントリーで作成した"あやめ"の分類モデルを使い、
外部から多項分類可能なAPIを作成します。
POSTデータをHTTPリクエストで送信し、JSON形式の分類データの取得を目指します。
※送信するPOSTデータの形式は以下となります。
{
"sl" : "5.7",
"sw" : "4.4",
"pl" : "1.5",
"pw" : "0.4"
}
構成
外部から AWS Machine Learning 機能を使用するためには、API Gateway、Lambda を経由する必要があるため、
環境としては以下のような構成となります。
ここから各々の機能のセットアップをしていきます。
Machine Learning
- Machine Learning にアクセスするためのロールを作成
"セキュリティ & アイデンティティ" から "Identity & Access Management" を選択
"新しいロールの作成" を選択
任意のロール名を入力(ここでは"MachineLearningIrisRole"を入力)
"AWS Lambda" を選択
探しやすくするため "MachineLearning" でフィルターをかけ、
"AmazonMachineLearningRealTimePredictionOnlyAccess" にチェックを入れて次へ
内容を確認して、"ロールの作成" を選択
- ML model を設定
前回のエントリで作成した モデルを選択
Summary から "Create endpoint" を選択
※エンドポイント生成後に表示されるエンドポイントのURLとこのモデルIDを控えておきます。
Lambda
"コンピューティング" から "Lambda" を選択します
"Create a Lambda function" を選択
"node-exec" を選択
"Next" を選択
Name: 任意の関数名を入力(ここでは"IrisCheck" と入力)
Description: 任意
Runtime : "Node.js 4.3" を指定
以下のコードを入力
※[使用するモデルID][使用する予測エンドポイント]には、先ほど控えた内容を入力
'use strict';
console.log('Loading event');
exports.handler = function(event, context) {
// 入力パラメータログ出力
console.log("sl = " + event.sl);
console.log("sw = " + event.sw);
console.log("pl = " + event.pl);
console.log("pw = " + event.pw);
// AWS
var aws = require('aws-sdk');
aws.config.region = 'us-east-1';
// MachineLearning
var ml = new aws.MachineLearning();
// パラメータ設定
var params = {
MLModelId: '[使用するモデルID]',
PredictEndpoint: '[使用する予測エンドポイント]',
Record: {
"Sepal_length" : event.sl,
"Sepal_width" : event.sw,
"Petal_length" : event.pl,
"Petal_width" : event.pw
}
};
// 予測実行
ml.predict(params, function(err, data) {
if (err) {
context.fail(err.stack);
} else {
context.succeed(data);
}
});
};
Existing role : 先ほど作成したロールを指定(ここでは"MachineLearningIrisRole"を指定)
Timeout : 20秒 を指定(デフォルト値(3秒)だとタイムアウトエラーが発生するため)
"Next" を選択
内容を確認して "Create function" を選択
作成した Lambda function をテストする
"Action" から "Configure test event" を選択
テストデータを入力し、"Save and test" を選択
結果を確認し、正しく分類されている事を確認
API Gateway
"アプリケーションサービス" から "API Gateway" を選択
"APIの作成"を選択
"新しいAPI"を選択し、以下内容を入力して"APIの作成"を選択
API名 : 任意のAPI名を入力(ここでは"IrisAPI"を入力)
説明 : 任意
"/" を選択した状態で、アクションから "メソッドの作成" を選択
"POST"を選択後、チェックマークアイコンをクリック
統合タイプ : Lambda関数
Lambdaリージョン : 任意
Lambda関数 : 先ほど作成した関数名を入力(ここでは"IrisCheck"を入力)
"保存"を選択
"OK" を選択
作成した API をテストする
"テスト" をクリック
リクエスト本文に、データを入力し "テスト" を選択、
レスポンス本文に分析結果が正しく表示されている事を確認
作成した API をデプロイする
アクションから "APIのデプロイ" を選択
デプロイされるステージ : 新しいステージ
ステージ名 : 任意のステージ名(ここでは"IrisStage"と入力)
ステージの説明 : 任意
デプロイメントの説明 : 任意
"デプロイ" を選択
外部からAPIの実行テストをするためステージから "POST"を選択した際に表示される URLをコピーしておきます。
外部から作成した API をテストする
今回は Chromeブラウザで "DHC REST Client" という Webアプリを使って試験を行いました。
先ほどコピーしたURLを入力し、POSTを選択、予測したいデータを入力し "Send"を選択します。
レスポンスに分類結果がJSON形式で取得出来ました。
以上、今回は外部から多項分類を実行出来るAPIの作成を行ってみました。