Movable Type には 「Data API」 というREST APIがあり、記事データなどAPI経由で取得することができます。
Data APIを利用するためには、APIのエンドポイントへ通信を行う必要があります。このとき、JavaScript などでコードを書くと、Data APIのURIを記述することになるため、Movable Type がインストールされている場所がある程度特定できます。
一方で、セキュリティの観点から、Movable Type の場所を隠したい、という要求もあるでしょう。
そこで、AWS Lamdba + API Gateway を利用して、
「Movable Type のData APIの場所を隠しつつ、AWSのAPI Gateway 経由で、記事データを取得する」
をやってみました。
やること
- AWS Lambda で、Movable Type の Data API から記事データを取得する
- API Gateway から、上記のデータを取得できるようにエンドポイントを公開する
流れ
- Lambda でMovable Type の API からデータを取得する関数を作成する
- API Gateway でエンドポイントを設定する
- Lambda 関数とAPI Gateway を紐付ける
Lambda で Movable Type の APIからデータを取得する関数を作成する
最初に、Lambda 関数用のコードを記述します。
今回は、Node.jsの「request」パッケージを利用して通信を行います。
任意のパッケージ作成用ディレクトリを作成。ここでは「work」とする。
mkdir work
作業用ディレクトリに移り、Node.jsを利用するためにnpm init して、requestパッケージをインストール
cd work
npm init
npm install request
Movable Type から記事データを取得するコード、index.jsを作成。
exports.handler = function(event, context, callback) {
'use strict';
// requestを読み込み
// Movable Type の Data APIエンドポイントを変数に定義
const request = require('request');
const URL = 'http://your-mt/mt-data-api.cgi/v3/sites/サイトID/entries';
// 関数「getEntries」で取得した記事データをコールバックで返す
getEntries().then(function(response) {
callback(null, response);
});
// Movable Type のData APIを叩くための関数「getEntries」を作成
// Promise で取得したJSONデータを返す
function getEntries() {
return new Promise((resolve, reject) => {
request.get({
uri: URL,
json: true
}, function(err, req, data) {
resolve(data);
});
});
}
}
上記で作成したファイル一式を、Lambdaにインポートするために、zipで圧縮する。
zip -r myLambda.zip index.js node_modules
zipファイルが完成したら、Lamdba 関数を作成します。
AWSのコンソールからLambda を選び、新規関数を作成。IAMロールは、Lambdaの実行権限を持つロールを選択。
関数を作成したら、前もって作っていたzipファイルをアップロード
APIへの通信のための時間を見込み、タイムアウト設定を30秒に設定
設定が終わったら保存します。
テストケースを作成して、実行。Movable Type から記事データが取得できていれば成功です。
次に、Lambda 関数を実行するためにAPI Gateway をトリガーとして設定します。右の一覧からAPI Gateway をトリガーとして選択。
「新規API」を選択。名前を決めます。なんでも良いですが、今回は「mt」としました。
ステージ名は、公開されるエンドポイントのパス名に含まれる。「mt」としました。
セキュリティは、どこからでも利用できるように「オープン」を選択。
API Gateway でエンドポイントを設定する
作成したAPI Gateway の設定に移動します。
AWSのコンソール画面から、API Gateway を選択して、作成したAPIの設定画面に移動。
アクションから「リソースの作成」を選択。
このリソース名は、エンドポイントのURLのパスとして使われます。
今回は「entries」としました。
次にメソッドを作成。ここでは「get」を選択。
統合タイプ=>Lambda関数
Lambdaリージョン=>今回作成したLambdaのリージョンを選択
Lambda関数=>今回作成したLambda関数を選択
設定が終わったら保存。
保存したら、テストを実行して、期待通りの記事データが取得できているかを確認する。
問題がないことを確認できたら、APIを公開します。
アクションから「APIのデプロイ」を選ぶ。
デプロイするステージは「mt」を選択。
デプロイが完了したら、左メニューから「ステージ」を選択。今作成したAPIのエンドポイント「https://hogehoge.amazonaws.com/mt/entries」が公開されていることがわかる。
このエンドポイントにGETメソッドでアクセスすると、MTの記事データが取得できます。
積み残しと備考
積み残し:
Lambdaプロキシの統合を試してみる。
備考:
Lambda 関数とAPI Gateway を利用することで、Movable Type のインストール場所を隠すことができる一方で、AWSを経由する分だけ処理時間は長くなる。
どちらを優先するかは考えどころ、と言えそうです。
参考情報