CoffeeScriptで記述したAWS Lambda関数をGulpでデプロイする


タイトルの通り、AltJS系言語であるCoffeeScriptを用いてAWS Lambda関数を記述し、それをGulpを使ってデプロイする手順について述べます。

※2015年10月9日追記

より手軽にAWS LambdaでCoffeeScriptを使うためにlamjetというツールを作成し、それについての記事を書きました。あわせてご参照ください。
lamjet を使って AWS Lambda に CoffeeScript で書かれた関数を楽々デプロイする方法

1. やりたいこと

  • AWS Lambdaの関数(以下、Lambda関数)をCoffeeScriptを用いて記述する
  • Lambda関数をgulpコマンド1発でデプロイする

2. 結論

lambduh/lambduh-gulpを使うのが便利です。ZIPファイルの生成、アップロードなどのGulpタスク一式が含まれています。

他にも以下の様なGulpプラグインが見つかりますが、どちらもLambda関数の登録、アップロードを主眼としており、関連タスクまでは含まれていません。複数のLambda関数のアップロードを行うなど、より細かい、より複雑な制御を行う場合は、これらの方が便利かもしれません。

3. jsタスクの上書き

lambduh/lambduh-gulpはJavaScript用に作られているため、CoffeeScriptを使う場合にはjsタスクの上書きが必要です。

gulpfile.coffee(抜粋)
# ...
gulp.task "js", ->
  gulp.src("./src/*.coffee")
    .pipe(coffee({bare: true})).on("error", gutil.log)
    .pipe(gulp.dest("./dist"))

4. ファイル構成

今回は、1つのLambda関数を1つのディレクトリとして管理します。ファイル構成は以下の通り。

lambda-function-name/  ..  Lambda関数の管理用ディレクトリ。
  dist/  ................  ビルド結果が格納されるディレクトリ。Gulpにより生成される。
  node_modules/  ........  パッケージディレクトリ。
  src/  .................  CoffeeScriptを格納するディレクトリ。
    index.coffee  .......  Lambda関数の本体。
  dist.zip  .............  Lambda関数のZIPアーカイブ。Gulpにより生成される。
  gulpfile.coffee  ......  Gulpの設定ファイル。後述。
  lambda-config.js  .....  Lambda関数の設定ファイル。後述。
  package.json  .........  パッケージの設定ファイル。後述。

5. 設定ファイルの例

設定ファイルの例は以下の通り。少なくともlambda-config.jsFunctionNameRoleRegionを環境に合わせて書き換える必要があります。

gulpfile.coffee
gulp        = require "gulp"
coffee      = require "gulp-coffee"
gutil       = require "gulp-util"
lambduhGulp = require "lambduh-gulp"

lambduhGulp gulp

gulp.task "js", ->
  gulp.src("./src/*.coffee")
    .pipe(coffee({bare: true})).on("error", gutil.log)
    .pipe(gulp.dest("./dist"))
lambda-config.js
module.exports = {
  FunctionName: "function-name",
  Description: "description",
  Handler: "index.handler",
  Role: "arn:aws:iam::XXXXXXXXXXXX:role/yyyy",
  Region: "us-east-1",
  Runtime: "nodejs",
  MemorySize: 128,
  Timeout: 3
}
package.json(抜粋)
{
  "devDependencies": {
    "coffee-script": "^1.9.3",
    "gulp": "^3.9.0",
    "gulp-coffee": "^2.3.1",
    "gulp-util": "^3.0.6",
    "lambduh-gulp": "^0.1.1"
  }
}

6. デプロイ

上記の設定ファイルを用意することで、下記の1行でLambda関数がビルド、ZIPファイル化、アップロードされます。
内部的にaws-sdkが使われており、AWS CLIなどと同様に、認証に関する情報を~/.aws/credentialsファイルや環境変数に設定する必要があります。

$ gulp zipload

7. 参考