pulkitsinghal
pulkitsinghal

Reputation: 4084

Callback hook into AWS APIs

Does anyone know of a way or has anyone devised a clever workaround to place a callback/hook into the Amazon APIs (http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/query-apis.html) such that for actions like create instance, one can simply be notified via the callback when the instance is in the running state?

I'm thinking that I could write a loop in node.js that simply checks for the desired state and eventually timesout after a certain # of requests but I would like to hear better programmatic approaches :)

Upvotes: 1

Views: 595

Answers (2)

Mauvis Ledford
Mauvis Ledford

Reputation: 42354

Your best bet would be to add a shell script on the servers init.d, which will run whenever the server is stopped or started.

Probably useless for this question but other ways of programmatically detecting whether an instance on is by using Amazon's EC2 shell tools:

ec2-describe-instance-status <ec2 instance id>

As described here. Which will return blank if the machine is not running, and data about it if it is.

Upvotes: 1

Michelle Tilley
Michelle Tilley

Reputation: 159105

Unless the AWS APIs support some kind of notification endpoint (I'm not very familiar with the APIs) you're probably stuck with polling. However, you could use an EventEmitter to hide this behind a clever API that exposes a callback. Pseudo-ish code:

// aws_server.js

var EventEmitter = require('events').EventEmitter;
var util = require('util');

function AwsServer(some_data) {
  this.data = some_data;
  EventEmitter.call(this);
};
util.inherits(AwsServer, EventEmitter);

AwsServer.prototype.createInstance = function() {
  // Do something with an API to create an EC2 instance
  console.log("Creating instance, data:", this.data);

  // Here, you would begin polling for state changes, etc. waiting for
  // the server to change state. We will simulate this with a setTimeout call.
  setTimeout(function() {
    this.emit('running');
  }.bind(this), 3000);
};

module.exports = AwsServer;

// somewhere_else.js

var AwsServer = require('./aws_server')

var newServer = new AwsServer('some_data');
newServer.on('running', function() {
  console.log('New instance is running');
});

newServer.createInstance();

Upvotes: 1

Related Questions