npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

marchio-lambda-post

v0.3.1

Published

REST POST to DynamoDB via Lambda

Downloads

4

Readme

marchio-lambda-post

REST POST to DynamoDB via Lambda

Installation

$ npm init
$ npm install marchio-lambda-post --save

Lambda Setup

References


Steps

Create Test Role

  • Browse to: https://console.aws.amazon.com/iam/
  • Click: Roles (from the left column)
  • Click: Create new role
  • Step 1: Select role type
  • For AWS Lambda, click: Select
  • Step 2 is automatically skipped
  • Step 3: Attach policy
  • Select both AmazonDynamoDB* policies
  • Click: Next Step
  • Create a name for the role (like lambda-db-test)
  • Click: Create role

Create Lambda Function

  • Browse to: https://console.aws.amazon.com/lambda
  • Click: Create a Lambda Function
  • Select: Blank Function
  • Click: Next
  • Name: marchio
  • Description: Marchio service
  • Runtime: Node.js 4.3
  • Set the Role values
  • Click: Next
  • Click: Create Function

Setup API Gateway

  • Browse to: https://console.aws.amazon.com/apigateway
  • Click: Create API
  • Select: New API
  • API name: marchio
  • Description: Marchio service
  • Click: Create API
  • Click on the slash (/)
  • Drop down: Actions
  • Select: Create Resource
  • Check: Configure as proxy resource
  • (Optionally enabled CORS)
  • Click: Create Resource
  • For Integration type select: Lambda Function Proxy
  • Lambda Region: For example: us-east-1
  • Lambda Function: marchio
  • Click: Save
  • Add Permission to Lambda Function: OK
  • Drop down: Actions
  • Select: Deploy API
  • Define a new stage (call it "test")
  • Click: Deploy
  • Save the Invoke URL

Create DynamoDB Table

  • Browse to: https://console.aws.amazon.com/dynamodb/
  • Click: Create Table
  • Table name: mldb
  • Primary key: eid
  • The type should be the default (string)
  • Click: Create
  • After some churning, click the Capacity tab
  • Set the Read / Write capacity units to 1 to save money while testing
  • Click: Save

Example and Deploy

See the deployment example located in the repo under:

  • examples/deploy

It contains a deployment script and an example lambda source file.

  • Install the dependencies by running:
$ npm install

To run the script you must first make it runnable:

$ chmod +x deploy-lambda.sh

To test:

  • Deploy the API via API Gateway
  • Create an environment variable called AWS_HOST_MARCHIO which is set to the invocation url
  • Test the deployment using curl:
$ curl -i -X POST -H "Content-Type: application/json" -d '{"email":"[email protected]"}' $AWS_HOST_MARCHIO/test/marchio
  • The response should contain a 201 status code and a copy of the created record, along with its id (eid)
  • Browse the DynamoDB table to see the new record.

Modules

marchio-lambda-post

Module

marchio-lambda-post-factory

Factory module

marchio-lambda-post-factory.create(spec) ⇒ Promise

Factory method It takes one spec parameter that must be an object with named parameters

Kind: static method of marchio-lambda-post-factory
Returns: Promise - that resolves to {module:marchio-lambda-post}

| Param | Type | Description | | --- | --- | --- | | spec | Object | Named parameters object | | spec.event | Object | Lambda event | | spec.context | Object | Lambda context | | spec.callback | function | Lambda callback | | spec.model | Object | Table model | | [spec.filter] | function | A function that takes the original record and returns a {Promise} that resolves to a filtered record |

Example (Usage example)

// Lambda root file
"use strict";

var mlFactory = require('marcio-lambda-post'); 

var getRandomInt = function (min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
};

// Why not just demo hashing with bcrypt?
// Because bcrypt requires installing on AWS Linux before packaging
// That's beyond the scope of this example, so we fake it.
 
function fakeHash( record ) {
   // Not a real hash function - do not use in production
   return new Promise( (resolve, reject) => {
        if(!record) {
            return reject('record not defined');
        }
        if(!record.password) {
            return reject('record.password not defined');
        }
        // fake hashing - do not use in production
        record.password = '$' + getRandomInt(10000, 10000000);
        resolve(record);
   });
}

exports.handler = function(event, context, callback) {

    var model = {
        name: 'mldb',   // must match DynamoDB table name
        partition: 'eid', // primary partition key - cannot be reserved word (like uuid)
        // sort: 'gid', // primary sort key
        fields: {
            email:    { type: String, required: true },
            status:   { type: String, required: true, default: "NEW" },
            // Password will be (fake) hashed by filter before being saved
            password: { type: String, select: false },  // select: false, exclude from query results
        }
    };

    mlFactory.create({ 
        event: event, 
        context: context,
        callback: callback,
        model: model,
        filter: fakeHash
    })
    .catch(function(err) {
        callback(err);
    });
 };

Testing

To test:

  • Deploy the example (examples/deploy)

  • Go to the root folder and type (sans $):

    $ npm test


Repo(s)


Contributing

In lieu of a formal style guide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code.


Version History

Version 0.3.1

  • updated deploy example with latest build
  • removed model name from test case url

Version 0.3.0

  • removed model/table name from url
  • updated example url's

Version 0.2.2

  • added support for sort key (model.sort) - see examples

Version 0.2.1

  • updated example project

Version 0.2.0

  • changed model.primary to model.partition

Version 0.1.6

  • Updated documentation with filtered example

Version 0.1.5

  • Added filter support

Version 0.1.4

  • Fixed dependency issue

Version 0.1.3

  • Refactored db-post module

Version 0.1.2

  • Refactored db-post module

Version 0.1.1

  • Fixed some doc issues

Version 0.1.0

  • initial release