[追記]
今のlambdaはv8系に対応したので、以下のボイラープレートを使わなくてもasync/awaitは使うことができます。
ただ、webpackでbundleしたい場合はボイラープレートのコードが参考になるかもしれません。
現在のlambdaでは、node.jsはv6.10までしか対応しておらずasync/awaitはそのままでは使えない。
簡単にasync/awaitを使えるようにボイラープレートを作った。
利用の流れ
- src/app.jsにコードを書いていく
- webpack+babelでトランスパイルして一つのjsファイルにまとめる
- 生成したjsファイルをzip化
- zipファイルをLambdaに手動デプロイ
* デプロイを自動化するツールもあるらしいですが、設定が大変そうだったのでやめました。Lambda初心者かつnodeでasync/awaitを使いたい人に向けたものです。
ファイル構成
root/
├ src/
│ └ app.js
├ .babelrc
├ package.json
└ webpack.config.js
Babel
{
"presets": [
["env",{
"targets": {
"node": "6.10"
}
}]
]
}
Babelのプラグインには_babel-preset-env_を使用した。少し前には_babel-preset-es2015_が使われていたが、現在は_babel-preset-env_を使うほうがよいとのこと。
.babelrc
でtargetsにnodeのv6.10を指定することで、そのバージョンで動くようにトランスバイルしてくれる。
Webpack
const path = require('path');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
target: 'node',
entry: path.resolve(__dirname, 'src/app.js'),
output: {
path: path.resolve(__dirname),
filename: 'index.js',
libraryTarget: 'umd',
},
resolve: {
extensions: ['.js'],
},
plugins: [
new UglifyJsPlugin(),
],
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: [{
loader: 'babel-loader',
}],
},
],
},
};
本当はBabelを使ってトランスパイルするだけでasync/awaitは使えるようになる。
しかしwebpackでバンドルしないとnode_moduleもzip化する必要があり、ファイルサイズが数十MBまで膨らんでしまった。
そのため、webpackでバンドルしている。
src/app.js
をentryとしてroot直下にindex.jsを吐き出している。
webpack.config.jsははまりどころで設定にミスがあるとLambdaにデプロイしたときに正しく動いてくれない。
特に以下の点に注意。
- targetにnodeが指定されているか
- output.libraryTargetが'umd'になっているか
zip化
ボイラープレートではpackage.json内で以下のようにnpm scriptsを設定している。
{
"scripts": {
"build": "webpack && npm run build:zip",
"build:zip": "rm -f Lambda.zip && zip Lambda.zip index.js"
}
}
シェルからyarn build
を実行するとLambda.zipが生成される。
あとはLambda.zipをブラウザからデプロイすればOK。