やはり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)は作りたいですね。