Skip to content

Instantly share code, notes, and snippets.

@ryanfitz
Created July 17, 2015 18:46
Show Gist options
  • Save ryanfitz/8febe89a8208c810f98b to your computer and use it in GitHub Desktop.
Save ryanfitz/8febe89a8208c810f98b to your computer and use it in GitHub Desktop.
index dynamodb data to cloudsearch using AWS Lambda
var AWS = require('aws-sdk');
exports.handler = function(event, context) {
var cloudsearchdomain = new AWS.CloudSearchDomain({endpoint: 'doc-dev-cinch-accounts-ltmqj5gt5mjb5hg5eyqaf2v5hu.us-east-1.cloudsearch.amazonaws.com'});
var documents = event.Records.map(function(record) {
var data = {id : record.dynamodb.Keys.id.S};
if (record.eventName === 'REMOVE') {
data.type = 'delete'
} else {
var image = record.dynamodb.NewImage;
data.type = 'add'
data.fields = {
name : image.name.S,
username : image.username.S,
email : image.email.S
};
}
return data;
});
var params = {contentType: 'application/json', documents : JSON.stringify(documents) };
console.log('uploading documents to cloudsearch domain', params);
cloudsearchdomain.uploadDocuments(params, function(err, data) {
if(err) {
console.log('Error uploading documents to cloudsearch', err, err.stack);
context.fail(err);
} else {
context.succeed("Successfully processed " + event.Records.length + " records.");
}
});
};
@brianfoody
Copy link

Nice work @ryanfitz. Is there any library that maps the new image directly to an object I can populate to cloudsearch? I hate having to manually go into the field and access the .S or .N, it seems a bit mad when the whole point of dynamodb is to have dynamic fields.

@Sandyman
Copy link

Great job @ryanfitz. How did you set up the policies so your lambda was able to upload documents to CloudSearch?

@TheSharpieOne
Copy link

@brianfoody you can iterate over the keys in image and use output from aws-sdk/lib/dynamodb/converter (const output = require('aws-sdk/lib/dynamodb/converter').output;) to do the rest of the type mapping all of the way down (nested). See https://github.com/aws/aws-sdk-js/blob/v2.32.0/lib/dynamodb/converter.js#L124-L176
Something like (using the newer lambda node versions):

const output = require('aws-sdk/lib/dynamodb/converter').output;
// ...
data.fields = Object.keys(image).reduce((prev, next) => {
  prev[next] = output(image[next]);
  return prev;
}, {});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment