What is aws-lambda?
The aws-lambda npm package provides types and interfaces for AWS Lambda functions, enabling developers to write TypeScript code for AWS Lambda with type safety. It includes type definitions for various AWS services and event sources that can trigger Lambda functions.
What are aws-lambda's main functionalities?
APIGatewayProxyHandler
This feature allows you to define a Lambda function that handles API Gateway proxy events. The code sample demonstrates a simple Lambda function that returns a JSON response with a 'Hello, world!' message.
const { APIGatewayProxyHandler } = require('aws-lambda');
const handler: APIGatewayProxyHandler = async (event, context) => {
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello, world!' })
};
};
exports.handler = handler;
S3Handler
This feature allows you to define a Lambda function that handles S3 events. The code sample demonstrates a Lambda function that logs the bucket name and object key for each record in the S3 event.
const { S3Handler } = require('aws-lambda');
const handler: S3Handler = async (event, context) => {
for (const record of event.Records) {
console.log(`Bucket: ${record.s3.bucket.name}, Key: ${record.s3.object.key}`);
}
};
exports.handler = handler;
DynamoDBStreamHandler
This feature allows you to define a Lambda function that handles DynamoDB stream events. The code sample demonstrates a Lambda function that logs the event ID and event name for each record in the DynamoDB stream event.
const { DynamoDBStreamHandler } = require('aws-lambda');
const handler: DynamoDBStreamHandler = async (event, context) => {
for (const record of event.Records) {
console.log(`Event ID: ${record.eventID}, Event Name: ${record.eventName}`);
}
};
exports.handler = handler;
Other packages similar to aws-lambda
serverless
The serverless package is a framework for building and deploying serverless applications. It supports multiple cloud providers, including AWS, and provides a higher-level abstraction compared to aws-lambda. It includes features for managing infrastructure, deploying functions, and integrating with various services.
aws-sdk
The aws-sdk package is the official AWS SDK for JavaScript. It provides a comprehensive set of APIs for interacting with AWS services, including Lambda. While it does not provide type definitions for Lambda events like aws-lambda, it is essential for making API calls to AWS services from your Lambda functions.
claudia
The claudia package is a tool for deploying Node.js projects to AWS Lambda and API Gateway. It simplifies the deployment process and provides utilities for managing Lambda functions and API Gateway configurations. It focuses on ease of use and quick deployment, similar to aws-lambda but with additional deployment features.
cli-lambda-deploy
Command line tool deploy code to AWS Lambda.
Notes
Versions prior to 1.0.5 suffer from "Command Injection" vulnerability,
thanks snyk.io and Song Li of Johns Hopkins University for reporting.
Installation
npm install -g aws-lambda
WARN: upgrading to v1.0.0 will remove your function environment and layers if they are not defined in the config file
Config file
- PATH must point to your code folder and is relative to the config file
- PATH can be relative or absolute
- If not set, Runtime defaults to nodejs10.x
- If not set, FunctionName defaults to the name of the config file ("my-function" in this case)
- You can use Ref to reference environment variables in the form of env.YOUR_ENVIRONMENT_NAME
lambda deploy <file.lambda>
credentials needs permissions to CreateFunction, UpdateFunctionConfiguration and UpdateFunctionCodelambda delete <file.lambda>
credentials needs permissions to DeleteFunctionlambda invoke <file.lambda>
credentials needs permissions to InvokeFunction
Sample JSON config
{
"PATH": "./test-function",
"AWS_KEY": { "Ref" : "env.AWS_ACCESS_KEY_ID" },,
"AWS_SECRET": { "Ref" : "env.AWS_SECRET_ACCESS_KEY"},
"AWS_REGION": "us-east-1",
"FunctionName": "test-lambda",
"Role": "your_amazon_role",
"Runtime": "nodejs10.x",
"Handler": "index.handler",
"MemorySize": "128",
"Timeout": "3",
"Environment": {
"Variables": {
"Hello": "World",
}
},
"Layers": [
"arn:aws:lambda:eu-central-1:452980636694:layer:awspilot-dynamodb-2_0_0-beta:1"
],
"Tags": {
"k1": "v1",
"k2": "v2"
},
"Description": ""
}
Sample YAML config
# unlike json, comments are allowed in yaml, yey!
# remember to use spaces not tabs 😞
PATH: ./new-function
AWS_KEY: !Ref "env.lambda_deploy_aws_key"
AWS_SECRET: !Ref "env.lambda_deploy_aws_secret"
AWS_REGION: "eu-central-1"
FunctionName: new-function-v12
Role: "arn:aws:iam::452980636694:role/CliLambdaDeploy-TestRole-1H89NZ845HHBK"
Runtime: "nodejs8.10"
Handler: "index.handler"
MemorySize: "128"
Timeout: "3"
Environment:
Variables:
Hello: "World"
Layers:
- "arn:aws:lambda:eu-central-1:452980636694:layer:awspilot-dynamodb-2_0_0-beta:1"
Tags:
k1: v1
k2: v2
Description: ""
Deploy from Local to AWS Lambda
// if installed globally then
$ lambda deploy /path/to/my-function.lambda
$ lambda deploy ../configs/my-function.lambda
// if 'npm installed' without the -g then you must use the full path
$ node_modules/.bin/lambda /path/to/my-function.lambda
// you can also add it in your scripts section of your package.json scripts: { "deploy-func1": "lambda deploy ../config/func1.lambda" }
$ npm run deploy-func1
Watch config file
aws-lambda can also watch the config file and the code folder specified in the config.PATH for changes and re-reploy on change
$ lambda start ../configs/my-function.lambda