AWS Lambda について書いた記事 の続きです。
Movable Type の REST API機能「Data API」では、記事データなどをAPI経由で取得することができます。
Data APIを利用するためには、APIのエンドポイントへ通信を行う必要があります。JavaScript などでコードを書くと、Data APIのURLを記述することになるため、Movable Type の場所がある程度特定できます。
一方で、セキュリティの観点から、Movable Type の場所を隠したい、という要求もあるでしょう。
今回は、Azure Functions を利用して、
「Movable Type のData APIの場所を隠しつつ、Azure Functions 経由で公開したAPIから記事データを取得する」
をやってみました。
やること
- Azure Functions で、Movable Type の Data API から記事データを取得し、利用できるようにAzure 上でエンドポイントを公開する
- GETパラメーターを取得できるようにする
流れ
- Azure Functions でMovable Type の API からデータを取得する関数を作成
- APIのエンドポイントを設定、公開
- GETパラメーターを解釈できるようにコードを修正
Azure Functions でMovable Type の API からデータを取得する関数を作成
関数の新規作成
最初に、Azure Portal から実行用の関数を作成します。
手順は この記事 とほぼ同様です。
- Azure のポータル画面から、[新規]を選ぶ
- 「functions」で検索=>[Functions App]を選択=>[作成]を行う
- アプリ名、リソースグループなどを設定してサービスを立ち上げる
最初のセットアップが終わったら、Functions のカスタム関数から新規関数を登録します。「HTTP Trigger」「JavaScript(=Node.js)」を選択する。
関数の作成が終わったら、REST APIとの通信のためのパッケージ「requests」をインストール。
インストールの手順は この記事 の通り。
Movable Type の Data APIから、記事一覧を取得する関数をNode.jsで記述します。
AWS Lambda で作成した関数とほとんど同じですが、
AWS Lambda にNode.jsを実行させるための書式
exports.handler = function(event, context, callback) {
// Do Something
callback(null, response);
}
Azure Functions でNjode.js を実行させるための書式
module.exports = function (context, req) {
// Do something
context.res = {
// Return Value
};
context.done();
}
と、微妙に書式が違うため、Functionsの書式に沿って書き換えます。
module.exports = function (context, req) {
'use strict';
// モジュールと通信のためのエンドポイントを変数に定義
const request = require('request');
const URL = 'http://path-to-your-mt/mt-data-api.cgi/v3/sites/サイトID/entries';
getEntries().then(function(response) {
context.res = {
headers : {
"Content-type" : "application/json",
},
body: response,
};
context.done();
});
function getEntries() {
return new Promise((resolve, reject) => {
request.get({
uri: URL,
json: true
}, function(err, req, data) {
resolve(data);
});
});
}
};
記述が終わったら、コードを保存。
テスト
テストを実行して、意図通りにMovable Type の記事データが取得できているかどうかを確認する。 うまくいかない場合。「Application Inight」を有効にしてログを確認するなどして状況を確認する。
APIのエンドポイントを設定、公開
関数の設定が終わったら、APIの公開設定を行います。
関数の左メニューから「統合」をクリック。
APIの各種設定を行う。初期状態では、すべてのメソッドが許可されている。
今回はGETメソッドのみ有効化するため、「Allowed HTTP methods」から「Slected Methods」を選び、GETのみチェックする。必要に応じてメソッドを追加する。
「Authorization level 」は、Fucntions の実行権限範囲を定義する。「Anoymoous」にすると、エンドポイントのURLを知っている人はだれでもアクセス可能なAPIとなる。
トリガー「HTTP」には(req)という文字がある。これは、GETメソッドで渡ってくる値が「req」に格納されているということ。GETメソッドのパラメーターを取得して何かしたい場合、reqを利用する。
設定ができたら保存。
エディタ画面に戻り「関数の URL の取得」をクリックすると、公開されているAPIのURLが確認できる。
APIのURLへアクセスすると、Movable Type の記事データが取得できていることがわかります。
GETパラメーターを解釈できるようにコードを修正
GETパラメーターで取得できる値をMovable Type に渡せるように変更してみます。
今回は、取得したい記事件数を設定するためのパラメータ「limit」の件数に応じて、Movbale Type の記事取得数を変更できるように修正してみました。
GETのパラメーター「req」にlimitの値が存在する場合、limitの件数をMovable Type の Data APIに渡してあげます。
module.exports = function (context, req) {
'use strict';
// モジュールと通信のためのエンドポイントを変数に定義
const request = require('request');
let URL = 'PATH-TO-YOU-MR/mt-data-api.cgi/v3/sites/サイトid/entries';
if (req.query.limit) {
URL += '?limit=' + req.query.limit;
}
getEntries().then(function(response) {
context.res = {
headers : {
"Content-type" : "application/json",
},
body: response,
};
context.done();
});
function getEntries() {
return new Promise((resolve, reject) => {
request.get({
uri: URL,
json: true
}, function(err, req, data) {
resolve(data);
});
});
}
};