7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS lambdaでasync/awaitを使うための最小構成

Last updated at Posted at 2018-02-26

[追記]
今のlambdaはv8系に対応したので、以下のボイラープレートを使わなくてもasync/awaitは使うことができます。
ただ、webpackでbundleしたい場合はボイラープレートのコードが参考になるかもしれません。

現在のlambdaでは、node.jsはv6.10までしか対応しておらずasync/awaitはそのままでは使えない。
簡単にasync/awaitを使えるようにボイラープレートを作った。

ボイラープレートのリポジトリ

利用の流れ

  1. src/app.jsにコードを書いていく
  2. webpack+babelでトランスパイルして一つのjsファイルにまとめる
  3. 生成したjsファイルをzip化
  4. zipファイルをLambdaに手動デプロイ

* デプロイを自動化するツールもあるらしいですが、設定が大変そうだったのでやめました。Lambda初心者かつnodeでasync/awaitを使いたい人に向けたものです。

ファイル構成

root/
 ├ src/
 │ └ app.js
 ├ .babelrc
 ├ package.json
 └ webpack.config.js

Babel

.babelrc
{
  "presets": [
    ["env",{
      "targets": {
        "node": "6.10"
      }
    }]
  ]
}

Babelのプラグインには_babel-preset-env_を使用した。少し前には_babel-preset-es2015_が使われていたが、現在は_babel-preset-env_を使うほうがよいとのこと。

.babelrcでtargetsにnodeのv6.10を指定することで、そのバージョンで動くようにトランスバイルしてくれる。

Webpack

webpack.config.js
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を設定している。

package.json
{
"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。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?