Lambda開発環境をEclipseで作る

やはりEclipse派の私としては是非ともEclipseでLambdaを開発したい、コードアシストを使いたい、ローカルで動かしたい、ということで開発できる環境を作ってみました。
まだ試行錯誤中ですが、Node.jsは使い始めたばかりでお作法が分かっていないので、より良い方法があれば是非教えて頂きたいと思いますm(_ _)m

Eclipseのインストール

Eclipseのサイトから、最新版(Luna)をダウンロードします(https://eclipse.org/downloads/)。

Node.jsのインストール

本家サイト(http://nodejs.org/)から、インストーラーをダウンロードしてインストールします。私はWindowsを使っているので、64bit版のバイナリをインストールしました。

Nodeclipseのインストール

Eclipseのマーケットプレースから「Nodeclipse」で検索して、インストールします。


念のため、NodeclipseからNode.jsへパスが通っているか確認します。EclipseメニューからWindow->Preferencesを選び、メニューからNodeclipseを選びます。メニューの中にパスを書く部分があるので、ここにNodeの実行ファイルへのパスが入っているかを確認します。


準備はこれでOKです。

Nodeプロジェクトの作成

Eclipseエクスプローラー右クリックから、new->Node.js projectを選択します。


ウィザードが出てくるので、適切なプロジェクト名を入れて、Template use to のところで「Hello World」を選択します。


そうすると、以下のようなプロジェクトセットが作られます。

AWS SDKのインストール(npm)

雛形のpackage.jsonの中に、次の行を追加します。

 "dependencies":{"aws-sdk":"latest" },

追加した後、ファイル右クリック->Run As->npm installを選択します。


うまく実行できると、プロジェクト内にnode_modulesというフォルダが出来ており、aws-sdkが入っていることが確認できると思います。
他に使いたいライブラリがある場合は、dependenciesに記述して実行、とするだけでモジュールをダウンロードしてくれるようです。

開発を始める

ローカルで動作させるために、4つファイルを用意しました。


1:aws-config.json・・・Lambda FunctionからAWS SDKを使ってS3などへのアクセスをするときに使う認証情報が入ったJSON

{ "accessKeyId": "アクセスキー", "secretAccessKey": "シークレットキー", "region": "デフォルトリージョン" }


2:event-args.json・・・Lambda Functionの引数として渡すデータが入ったJSON。初期データはLambdaのテスト画面から持ってくると楽です。

{
	"Records" : [ {
		"eventVersion" : "2.0",
		"eventSource" : "aws:s3",
		"awsRegion" : "us-west-2",
		"eventTime" : "1970-01-01T00:00:00.000Z",
		"eventName" : "ObjectCreated:Put",
//以下略


3:lambda-function.js・・・Lambda Functionの本体。ここにLambdaで動かすコードを書いていきます。

var aws = require('aws-sdk');
var http = require('http');
exports.aws = aws;

exports.handler = function(event, context) {
	var bucket = event.Records[0].s3.bucket.name;
	var key = event.Records[0].s3.object.key;
	var region = event.Records[0].awsRegion;
	var op = event.Records[0].eventName;
//以下略

若干ダサいのが、exports.aws = aws; としている点です。次のmain.jsを見ると分かりますが、aws-config.jsonを使って、aws変数を初期化しています。
NodeのSDKの場合、指定パスのファイル(%USER_DIR%/.aws/credential)を見てくれるはずなのですが、うまく動かなかったので苦肉の策でexports変数に入れています。


4.main.js・・・ローカルで動かすときの実行用JS

var lambda = require('./lambda-function.js');
//認証情報読み込み
lambda.aws.config.loadFromPath('./aws-config.json');
//引数読み込み
var event = require('./event-args.json');
//contextのモック作成
var context = {};
context.done = function(a, b) {
	if(a){console.log("ERROR:"+a);
	}else{console.log("SUCCESS");}
	console.log(b);
}
//Lambda Function呼び出し
lambda.handler(event, context);


上記4つを作成したNodeプロジェクトに入れて、main.js右クリックで実行すると、ローカルで動作させることが出来ます。コンソールログは、ちゃんとEclipseのコンソールに吐かれます。

最後に

NodeclipseはTypeScriptやCoffeeScriptにも対応しているため、今後挑戦してみたいと思います。
またモジュール込みでzip化してアップロードする手順を自動化するようなビルドスクリプト、あとid:winebarrel さんが作っているような直乗せスクリプトlambchop)は作りたいですね。