Apexは、AWS Lambdaのデプロイや実行が簡単にできるようになる、Lambda開発には必須と言っても過言ではないツールです。
ただ、サーバレスでイベントドリブンなLambdaの開発は、パッケージ管理やテストが若干面倒で、Apexだけでは物足りなかったので、npmをどうにか使えないか調べた所、AWS Lambdaの関数をnpmでパッケージ管理という記事が大変参考になりました。
そこで、上記記事を参考にApexとnpmでテスタブルなLambda開発環境のテンプレートを作ってみました。
Apex-npm-templateの使い方
必要な環境
- Node.js 4.3.2
- Apex 0.9.0
セットアップ→デプロイ→実行
$ git clone https://github.com/tayasu/apex-npm-template.git
$ cd apex-npm-template
$ apex deploy
$ apex invoke hello
ローカルでテスト→デプロイ
$ cd functions/hello
$ npm install
$ npm test
$ npm run apex deploy #functionディレクトリからapex実行するrun-script
Apex-npm-templateで出来ること
Lambdaの最新の実行環境であるNode.js 4.3.2に対応
ES6サポートなんで、アロー関数やPromiseが使えます。
特に便利だった機能が、AWS.RequestオブジェクトのPromise対応です。下記のように簡単に同期処理が書くことができます。
s3.getObject(param).promise().then((data) => {
// S3のデータを取得して結果を処理
return data.Body.toString().toUpperCase();
}).then((value) => {
// S3の処理完了後に同期的に次の処理
console.log(value);
}).catch((error) => {
// エラー処理
console.log(error);
});
詳しくは "Making Requests in Node.js" の "Support for Promises" の項を参照ください。
ローカルでテスト時にApexの環境変数を読み込み
Apexの便利な機能のひとつである環境変数機能をローカルでテスト実行にも利用できるようにしました。
Apexでbuildした際にproject.json
とfunction.json
の環境変数をマージしてenv.json
を作っていたので、同様の処理をnpm test
時にも行っています。
Apexの環境変数は下記のようにプロジェクトの環境変数と、functionごとの環境変数を管理でき、複数のfunctionを管理する場合には非常に便利です。
プロジェクトの環境変数
{
"environment": {
"FOO": "Be overwritten by function.json",
"BAR": "bar"
}
}
ファンクション毎の環境変数
{
"environment": {
"FOO": "foo"
}
}
プロジェクトとファンクションをマージした結果
console.log('ENV:%s,$s', process.env.FOO, process.env.BAR); //ENV:foo,bar
本番環境と開発環境の切り替え
Apexとnpmでローカルで簡単にテストができるようになると、次はLambdaの本番環境と開発環境を分けたくなります。
Apex-npm-templateには含めませんでしたが、私は下記の記事を参考に環境ごとにproject.json
を切り替えて運用しています。