[node]AWS LambdaをJavascriptから呼び出す

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

node.jsのプログラムから呼んでみる

最近AWS Lambdaにさわりはじめました。各所で有用な解説や使ってみた記事もあり、弊社ブログでもどんどん紹介されてます。
どっかの記事とかぶってる可能性は大いにありますが、今回はローカルのjavascriptからAWS Lambda関数を呼び出してみます。
※なお、AWS Lambdaについての環境構築や基本的なことはここで確認してみてください。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.9.4
  • node : v0.10.29

aws-sdkをnpmでインストールしておきましょう。

% mkdir aws-lambda && cd aws-lambda
% npm install aws-sdk

サンプル実装

1.AWSコンソールで関数登録

まずは、AWSコンソールでAWS Lambda関数を登録します。テンプレートを少しだけ変更して下記のようにします。
※登録方法はこのへん参照

console.log('Loading event');

exports.handler = function(event, context) {
    console.log('value1 = ' + event.myKey);
    context.done(null, 'Hello World');  // SUCCESS with message
};

2.Lambda関数を確認

次に、aws-lambdaディレクトリにapp.jsという名前のファイルを作成し、
Lambda関数情報を取得してみましょう。

//app.js
var AWS = require('aws-sdk');

AWS.config.update({
    accessKeyId:"<アクセスキー>",
    secretAccessKey:"<シークレットキー>",
    region:"<リージョン>"});

var lambda = new AWS.Lambda();

lambda.listFunctions({},function(err,data){
    console.log(data);
});

プログラムを実行すると、先ほど登録したmyFirstLambdaの情報が取得できます。

% node app.js      
{ Functions:
   [ { CodeSize: 290,
       ConfigurationId: '・・・',
       Description: 'this is lambda!',
       FunctionARN: 'arn:aws:lambda:us-west-2:・・・:function:myFirstLambda',
       FunctionName: 'myFirstLambda',
       Handler: 'index.handler',
       LastModified: Fri Nov 28 2014 12:08:10 GMT+0900 (JST),
       MemorySize: 128,
       Mode: 'event',
       Role: 'arn:aws:iam::・・・:role/lambda_exec_role',
       Runtime: 'nodejs',
       Timeout: 3 } ] }

3.Lambda関数の呼び出し

次に、myFirstLambda関数を実行してみましょう。invokeAsyncを使うことで、Lambda関数を呼び出せます。

//app.js
var AWS = require('aws-sdk');

AWS.config.update({
    accessKeyId:"<アクセスキー>",
    secretAccessKey:"<シークレットキー>",
    region:"<リージョン>"});

var lambda = new AWS.Lambda();

var params = {
    FunctionName: 'myFirstLambda',
    InvokeArgs: "{\"myKey\":\"hello lambda!\"}"
};

lambda.invokeAsync(params, function(err, data) {
    if (err) console.log(err, err.stack);
    else     console.log(data);
});

InvokeArgsには関数内で使用したい値を渡します。
文字列やStreamを指定することができ、文字列の場合はJSON形式にする必要があります。
上記プログラムを実行してAWSコンソールで結果を確認してみましょう。
app.jsで指定したJSON文字列が渡され、Lambda関数内で取得できているのがわかります。

lambda-result

まとめ

今回はAWS Lambda関数をローカルから呼び出してみました。
uploadFunctionというapiを使用すれば、Lambda関数を定義したzipファイルをアップロードすることもできるので、
いろいろな使い方ができそうですね。