概要
Amazon API Gatewayが発表されましたね!
個人的にAPI系のサービスは大好きなので早速試してみました。
今回は掲題の通りAmazon CloudSearchの検索結果をLambda通してAPIとして提供する仕組みを作ってみました。
Lambda
var aws = require('aws-sdk');
var cloudsearchdomain = new aws.CloudSearchDomain({
endpoint: '<CloudSearchのエンドポイント>'
});
exports.handler = function(event, context) {
var params = {
query:event.q
};
cloudsearchdomain.search(params, function(err, data) {
if (err) {
console.log("error " + err);
} else {
if (data.hits.found > 0) {
console.log(data.hits.hit[0]);
context.done(null, data.hits.hit[0]);
} else {
console.log('not found');
context.done(null, 'error');
}
}
});
};
Lambdaファンクションを作成します。event.qにてAPIから検索文字列を渡してもらって、それをそのままCloudSerch側へ投げ、結果をjsonで出力するというコードになっています。
CloudSearch
CloudSearch側には検索用のドメインを新規に作成して、
こんな感じの簡易な検索用のCSVをアップすることにします。
API経由でこのデータに対してアクセスを行い、検索データを取得する流れです。
Amazon API Gateway
こういったAPIを作成しました。GETメソッドでqというクエリストリングを受け取り、Lambdaからの返り値を返します。
クエリストリングの設定
Method Reauestにてクエリストリングが必要となる設定を行います。
Integration Requestでも渡ってきたクエリストリングがLambdaに渡せるように上記設定を行います。
APIキーの設定
また、検索サービスを想定してAPIキーを作って認証の仕組みも作ってあげます。
API KeysでAPIキーを作って、Method ReauestからAPI Key Requiredをtrueに設定しましょう。
APIのテストからデプロイ
準備が整ったので、APIのテストを実行します。クエリストリングに「banana」を入力すると正しく結果が返ってきました。問題ないので「Deploy API」からAPIを公開します。
これで「Invoke URL」にAPI用のエンドポイントが公開されました。
実行
curl --header 'x-api-key:<APIキー>' https://<APIエンドポイント>/prod?q=banana
としてリクエストを送ります。
まとめ
APIサービスがEC2無しで数時間でつくれちゃうのはすごいなと実感しました。
実際にAPIを作るときに面倒なのが認証の仕組みやAPIキーの管理ってとこだと思いますが、それもAPI Gatewayの中で管理してくれるのはすごくありがたいですね!