Posted at

Azure Functions で 作った関数を API として公開し、Movable Type のData API と連携する

More than 1 year has passed since last update.

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)」を選択する。

mt_functions_01.png

関数の作成が終わったら、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);
});
});
}
};

記述が終わったら、コードを保存。

mt_functions_03.png


テスト

テストを実行して、意図通りに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を利用する。

mt_functions_04.png

設定ができたら保存。

エディタ画面に戻り「関数の URL の取得」をクリックすると、公開されているAPIのURLが確認できる。

APIのURLへアクセスすると、Movable Type の記事データが取得できていることがわかります。

mt_functions_05.png


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);
});
});
}
};


参考情報