[AWS SDK for Node.js]イベントリスナを使用してAWS用APIを実行する

2013.02.28

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

AWS SDK for Node.jsの使用

AWS SDK for Node.jsを使ってAWSの各種サービスにアクセスする場合、下記のように関数の引数にコールバック関数を指定して、
そこでサービスアクセス結果を処理しているかと思います。

・
・
var ec2 = new AWS.EC2();
//インスタンス一覧を取得
ec2.client.describeInstances(function(err,data){
   console.log(data);
});

上のプログラムはインスタンス一覧を取得し、コールバック関数内で結果を処理します。
普通にAPIを使用するぶんには、ほとんどこの方法になるとおもいます。
しかし、イベントリスナを定義してAWSにアクセスする方法もあるので、今回はそれを紹介します。

環境構築方法

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

  • OS : MacOS X 10.7.4
  • Node.js : v0.8.15
  • npm : 1.1.66
  • aws-sdk : 0.9.5-pre.6

まだaws-sdkをインストールしていなければ、npmでaws-sdkをインストールします。

% mkdir sample
% cd sample
% npm install aws-sdk

ディレクトリにaws.jsonという名前のファイルを用意し、下記フォーマットでAWSアカウント情報を記述してください。

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

AWS.Requestにイベントリスナを定義する方法

EC2やS3など、各サービスにアクセスするためのメソッドは、パラメータとコールバックを引数に取ります。
さきほどのサンプルで使用していたdescribeInstances関数を例にとりましょう。
この関数を使うとき、下記のようにコールバックを指定せずに呼び出すと、AWS.Requestオブジェクトを返します。
※この関数だけでなく、AWS.XXX.Clientのすべてのメソッドがコールバックを指定しなかった場合にAWS.Requestを返します

var ec2 = new AWS.EC2();
var request = ec2.client.describeInstances();

このオブジェクトはAWS.EventEmitterを継承しており、イベントを登録することができます。
とりあえずdescribeInstances(インスタンス一覧取得)成功時のイベントを登録してみましょう。

request.on('success', function(response) {
    console.log(response.data);
});

実際にインスタンス一覧を取得するには、取得したAWS.Requestのsendメソッドを使用します。

request.send();

プログラム全体をのせておきます。
このプログラムを実行すると、インスタンス一覧が表示されます。

var AWS = require('aws-sdk');
AWS.config.loadFromPath('./aws.json');

var ec2 = new AWS.EC2();

var request = ec2.client.describeInstances();
request.on('success', function(response) {
    console.log(response.data);
});
request.send();

success以外にもいろいろなイベントがありますので、ドキュメントを確認してみてください。

ちなみに、イベントリスナの登録やsendの実行は下記のようにチェインさせることもできます。

・
・
request.
  on('success', function(response) {
    console.log("success");
  }).
  on('error', function(response) {
    console.log("erro");
  }).
  on('complete', function(response) {
    console.log("complete");
  }).
  send();

まとめ

AWS.Requestにはさまざまなイベントが定義されてますので、AWSへのアクセス方法をカスタマイズしたい場合は有用かもしれないですね。