ApexとnpmでLambda開発環境のテンプレートを作ってみた

  • 18
    いいね
  • 0
    コメント

Apexは、AWS Lambdaのデプロイや実行が簡単にできるようになる、Lambda開発には必須と言っても過言ではないツールです。
ただ、サーバレスでイベントドリブンなLambdaの開発は、パッケージ管理やテストが若干面倒で、Apexだけでは物足りなかったので、npmをどうにか使えないか調べた所、AWS Lambdaの関数をnpmでパッケージ管理という記事が大変参考になりました。
そこで、上記記事を参考にApexとnpmでテスタブルなLambda開発環境のテンプレートを作ってみました。

Apex-npm-template

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.jsonfunction.jsonの環境変数をマージしてenv.jsonを作っていたので、同様の処理をnpm test時にも行っています。
Apexの環境変数は下記のようにプロジェクトの環境変数と、functionごとの環境変数を管理でき、複数のfunctionを管理する場合には非常に便利です。

プロジェクトの環境変数

project.json
{
  "environment": {
    "FOO": "Be overwritten by function.json",
    "BAR": "bar"
  }
}

ファンクション毎の環境変数

function.json
{
  "environment": {
    "FOO": "foo"
  }
}

プロジェクトとファンクションをマージした結果

index.js
  console.log('ENV:%s,$s', process.env.FOO, process.env.BAR); //ENV:foo,bar

本番環境と開発環境の切り替え

Apexとnpmでローカルで簡単にテストができるようになると、次はLambdaの本番環境と開発環境を分けたくなります。
Apex-npm-templateには含めませんでしたが、私は下記の記事を参考に環境ごとにproject.jsonを切り替えて運用しています。

Lambda with Apex: 環境変数で環境別にLambda環境を整える