目的
aws lambdaのデプロイなどができるパッケージnode-lambdaでasync/await(es2017)を書けるようになる
プログラミングモデル (Node.js) - AWS Lambda
AWS Lambda は、現在以下の Node.js ランタイムをサポートしています。
* Node.js ランタイム v6.10 (ランタイム = nodejs6.10)
とあるように aws lambdaのNode.jsサポート環境は2018/02現在で6系までとなっており、async functionに対応していない
開発環境
$ node -v v8.9.3 $ npm -v 5.6.0
テストフレームワークはmochaを使う
Babel7を使う
babelのGitHubリポジトリはベータ版である7系で説明されており、webページだと6系をつかって説明されている。ここの差異ですごくハマった。
「@babel/hogeのようにインストールするのがナウい」と聞いて躍起になって7系を使おうとしてしまったが、冷静に考えたら6系でよかった。
なぜベータ版に必死になってしまったのか。
ということでbabel7系を使う場合はGitHubリポジトリを読みながら進めるのがよい。公式のDocやググった情報を参考にするとハマる(ハマった)。
package.jsonに入れるもの
- babel-preset-env
以下のリンクの説明によると、
https://github.com/babel/babel/tree/master/packages#presetsautomatically determines plugins and polyfills you need based on your supported environments
サポートされている環境に基づいて必要なプラグインとポリフィルを自動的に決定しますとのことなので、babel-preset-env
を入れる。
(es2017対応環境で使うとそのままのコードが吐き出されて、トランスパイルされてないと思って焦った。es2015対応環境で使えばちゃんとそこで動くようにトランスパイルされる。)
babel-register
単体テストのためにbabel-register
を入れる
npm-scriptsを書く
必要なパッケージをインストールしたらnpm-scriptsを書く
"scripts": { "test": "mocha --recursive", "compile": "babel src --out-dir compiled", "package": "node-lambda package -H /compiled/index.handler", "deploy": "node-lambda deploy -H /compiled/index.handler" },
各コマンドを説明する
"test": "mocha --recursive"
mocha.optsでbabel-registerを指定することでes2017で書いたテストを実行できる。 test/mocha.opts
--require @babel/register
mocha.optsを書かずに、"test": "mocha --recursive --require @babel/register"
としても可。
"compile": "babel src --out-dir compiled"
これでsrc/に入っているコードをトランスパイルしてcompiled/に出力する。"deploy": "node-lambda deploy -H /compiled/index.handler"
これでトランスパイルしたコードをlambdaのハンドラに指定してデプロイする。
npm run package
も同様。 https://github.com/motdotla/node-lambda#deploy-H, --handler [index.handler] Lambda Handler {index.handler}
まとめ
これでlambdaでasync/awaitを使うことができるようになった。
ポイントだなと思ったことはトランスパイルしたコードをlambdaのハンドラに指定すること。
今まで見てきたlambdaのディレクトリ構成がlambda/index.js,lambda/lib/lib.js(index.jsでインポートされている)みたいな構成だったので、
webpackいるのかと思って悩んだけど、babelだけで書けた。
package.json
{ "scripts": { "test": "mocha --recursive", "compile": "babel src --out-dir compiled", "package": "node-lambda package -H /compiled/index.handler", "deploy": "node-lambda deploy -H /compiled/index.handler" }, "devDependencies": { "@babel/cli": "^7.0.0-beta.39", "@babel/core": "^7.0.0-beta.39", "@babel/preset-env": "^7.0.0-beta.39", "@babel/register": "^7.0.0-beta.39", "chai": "^4.1.2", "mocha": "^5.0.0", } }