Lambdaアドベントカレンダーの15日めのぶんです。エントリーした当初はRedshiftへのデータロード云々を書こうと思ってたんだけど、すっかりその熱は冷めてしまったので開発手法やパッケージングについて書くことにします。お約束ですが、これは個人のメモ/意見であり、所属する組織を代表するものではありません。Lambdaのための関数のローカル開発とテストというのを書いたのだけど、この記事もそこベースにして続きを書き足している感じなのでだいぶかぶっている部分があるのはご容赦を。考え方AWSのサービスを使った開発をするときによく出てくるネタとしてあるのが「ローカルでの開発」。Localというモックみたいなものが配布されていて、基本的な考え方としては本物のサービスを使わずにローカルで動く代替物を用意して開発しようという話。自分で実装した関数がAWSサービスから呼び出されるサービスなので、モックではなくてドライバ的なものが必要、ということになる。現在のところLambdaを外から見る限り、以下のように実装した関数が呼び出されている。(app.jsというファイルにhandlerという名前でイベントハンドラを実装した場合)したがって、下記のようなドライバがあればよいということにあんる。require('./app');yourLambdaFunction.handler(event,context);eventオブジェクトやcontextオブジェクトについての補足は前回の記事に書いたので気になる方はそちらをどうぞ。require('./app');yourLambdaFunction.handler(event,context);以上のようなしくみを利用すればローカルでの動作確認だけではなく、いわゆる自動テスト等も実装できるようになる。以下のようなイメージだ。});});パッケージ管理テストを走らせることができるようになったので、ついでにパッケージ管理もしたくなる・・・ような気がするのでその辺も書いてみた。ここからが前回の記事からの続きの部分。node.jsにはnpmというパッケージ管理システム(rubyでいうgem、PHPでいうcomposerのようなもの)があるので、今回はこれに乗っかりたいと思う。パッケージ管理はnpmリポジトリでモジュールを配りましょう!という話ではなく、npmを使ってライブラリの依存関係やテストからデプロイまでを管理しましょうというお話。npmにはバージョン番号の管理や依存関係の管理を始めとしていろいろな機能があるが、今回は以下の部分につかっている。依存するnpmモジュールの管理スクリプトの管理。今回用意したのは以下のスクリプト。ユニットテストやLintなどのスクリプト。Lambdaにアップロードするためのパッケージング用のスクリプト。Lambdaアップロードのためのもろもろの設定(リージョンやらなにやら)を準備するスクリプト。実際にアップロードするスクリプト。Lambdaのための関数の開発からデプロイまでを行えるようなサンプルプロジェクトを作ってみた。publishでLambdaにアップロード実際にやってみる順を追って見て行きたいと思うので、まずはpackage.jsonはから。一般的なnpmのお作法通りだが、今回特に必要になる部分は以下の3つ。dependenciesに定義。devDependenciesに定義。aws-sdkはLambda側のランタイム環境に含まれているので、特定のバージョンが使いたい、みたいなことがないかぎりこちらからアップロードする必要はない。}}Testing/LintingテストやLintには基本的になんのモジュールでも使える。eslintを使ってみた。node.jsでやってる方法をそのまま真似してみた)Buildingアップロード用のファイルはZip形式に圧縮されている必要があるので、このZipファイルをパッケージに見立てて、そのファイル作成をビルドと呼ぶことにしている。パッケージのディレクトリ構成は以下のようにしてやる必要がある。excludes_str;}Uploadingここまで来たらあとはこのZipファイルのパッケージをLambdaにアップロードしてやればOK!なんだけど、アップロード時にもろもろの引数をわたしてやる必要があるので設定ファイルを出力するスクリプトを一段はさむ。Lambda}上記のようなJSONを単純に吐き出すだけのスクリプト。publishしたら以下のようなスクリプトが起動される感じにしてみた。これはawscliを使ってシェルで実装することも考えられたが、npmで制御できない依存関係を作りたくなかったのでnode.jsで実装した。lambdaConfig.handlerMethod;}まとめということで、何をやってきたかをまとめてみると、以下のようなステップを実現してみようぜという話でした。本番のLambdaを動かしてみるくらいまで出来てもいいかなぁと思ったのだけど、戻り値の受け取り方なのでいろいろ悩むところがあったのでそれはまたこんど。ライセンスこの記事中に記載されているコードスニペットはすべてMITライセンスにて提供されるものとします。雄太@imaifactoryすべての投稿は個人的意見であり、所属する企業や団体を代表するものではありません。upLoginユーザーは見つかりませんでした。