What is @aws-cdk/aws-lambda?
@aws-cdk/aws-lambda is an AWS Cloud Development Kit (CDK) module that allows you to define AWS Lambda functions and manage their configurations using code. It provides a high-level, object-oriented abstraction to define and deploy Lambda functions, making it easier to integrate with other AWS services and manage infrastructure as code.
What are @aws-cdk/aws-lambda's main functionalities?
Define a Lambda Function
This code defines a simple AWS Lambda function using the AWS CDK. The function uses Node.js 14.x runtime, specifies the handler, and points to the code directory.
const lambda = require('@aws-cdk/aws-lambda');
const cdk = require('@aws-cdk/core');
class MyStack extends cdk.Stack {
constructor(scope, id, props) {
super(scope, id, props);
new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
}
}
const app = new cdk.App();
new MyStack(app, 'MyStack');
Add Environment Variables
This code demonstrates how to add environment variables to an AWS Lambda function using the AWS CDK.
const lambda = require('@aws-cdk/aws-lambda');
const cdk = require('@aws-cdk/core');
class MyStack extends cdk.Stack {
constructor(scope, id, props) {
super(scope, id, props);
new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
environment: {
KEY: 'value',
},
});
}
}
const app = new cdk.App();
new MyStack(app, 'MyStack');
Add Permissions to Lambda Function
This code shows how to add permissions to an AWS Lambda function using the AWS CDK. In this example, the Lambda function is granted permission to get objects from an S3 bucket.
const lambda = require('@aws-cdk/aws-lambda');
const cdk = require('@aws-cdk/core');
const iam = require('@aws-cdk/aws-iam');
class MyStack extends cdk.Stack {
constructor(scope, id, props) {
super(scope, id, props);
const myFunction = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
myFunction.addToRolePolicy(new iam.PolicyStatement({
actions: ['s3:GetObject'],
resources: ['arn:aws:s3:::my-bucket/*'],
}));
}
}
const app = new cdk.App();
new MyStack(app, 'MyStack');
Other packages similar to @aws-cdk/aws-lambda
serverless
The Serverless Framework is a popular open-source framework for building and deploying serverless applications. It supports multiple cloud providers, including AWS, and provides a rich set of features for managing serverless functions, APIs, and events. Compared to @aws-cdk/aws-lambda, Serverless Framework offers a more provider-agnostic approach and a higher-level abstraction for defining serverless applications.
aws-sdk
The AWS SDK for JavaScript provides a set of tools for interacting with AWS services, including Lambda. While it is not specifically designed for infrastructure as code, it allows developers to programmatically manage AWS resources. Compared to @aws-cdk/aws-lambda, the AWS SDK is more low-level and requires more manual setup and configuration.
claudia
Claudia.js is a tool for deploying Node.js projects to AWS Lambda and API Gateway. It simplifies the process of setting up and managing serverless applications. Compared to @aws-cdk/aws-lambda, Claudia.js is more focused on Node.js and provides a simpler, more streamlined deployment process.
AWS Lambda Construct Library
This construct library allows you to define AWS Lambda Functions.
import lambda = require('@aws-cdk/aws-lambda');
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NodeJS810,
handler: 'index.handler',
code: lambda.Code.asset('./lambda-handler'),
});
Handler Code
The lambda.Code
class includes static convenience methods for various types of
runtime code.
lambda.Code.bucket(bucket, key[, objectVersion])
- specify an S3 object
that contains the archive of your runtime code.lambda.Code.inline(code)
- inline the handle code as a string. This is
limited to 4KB.lambda.Code.asset(path)
- specify a directory or a .zip file in the local
filesystem which will be zipped and uploaded to S3 before deployment.
The following example shows how to define a Python function and deploy the code
from the local directory my-lambda-handler
to it:
Example of Lambda Code from Local Assets
When deploying a stack that contains this code, the directory will be zip
archived and then uploaded to an S3 bucket, then the exact location of the S3
objects will be passed when the stack is deployed.
Layers
The lambda.LayerVersion
class can be used to define Lambda layers and manage
granting permissions to other AWS accounts or organizations.
Example of Lambda Layer usage
Event Sources
AWS Lambda supports a variety of event sources.
In most cases, it is possible to trigger a function as a result of an event by
using one of the onXxx
methods on the source construct. For example, the s3.Bucket
construct has an onEvent
method which can be used to trigger a Lambda when an event,
such as PutObject occurs on an S3 bucket.
An alternative way to add event sources to a function is to use function.addEventSource(source)
.
This method accepts an IEventSource
object. The module @aws-cdk/aws-lambda-event-sources
includes classes for the various event sources supported by AWS Lambda.
For example, the following code adds an SQS queue as an event source for a function:
import { SqsEventSource } from '@aws-cdk/aws-lambda-event-sources';
fn.addEventSource(new SqsEventSource(queue));
The following code adds an S3 bucket notification as an event source:
import { S3EventSource } from '@aws-cdk/aws-lambda-event-sources';
fn.addEventSource(new S3EventSource(bucket, {
events: [ s3.EventType.ObjectCreated, s3.EventType.ObjectDeleted ],
filters: [ { prefix: 'subdir/' } ]
}));
See the documentation for the @aws-cdk/aws-lambda-event-sources module for more details.
Lambda in CodePipeline
This module also contains an Action that allows you to invoke a Lambda function from CodePipeline:
import codepipeline = require('@aws-cdk/aws-codepipeline');
const pipeline = new codepipeline.Pipeline(this, 'MyPipeline');
const lambdaAction = new lambda.PipelineInvokeAction({
actionName: 'Lambda',
lambda: fn,
});
pipeline.addStage({
actionName: 'Lambda',
actions: [lambdaAction],
});
You can also create the action from the Lambda directly:
const lambdaAction = fn.toCodePipelineInvokeAction({ actionName: 'Lambda' });
The Lambda Action can have up to 5 inputs,
and up to 5 outputs:
const lambdaAction = fn.toCodePipelineInvokeAction({
actionName: 'Lambda',
inputArtifacts: [
sourceAction.outputArtifact,
buildAction.outputArtifact,
],
outputArtifactNames: [
'Out1',
'Out2',
],
});
lambdaAction.outputArtifacts();
lambdaAction.outputArtifact('Out2');
See the AWS documentation
on how to write a Lambda function invoked from CodePipeline.
Lambda with DLQ
import lambda = require('@aws-cdk/aws-lambda');
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NodeJS810,
handler: 'index.handler',
code: lambda.Code.inline('exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'),
deadLetterQueueEnabled: true
});
See the AWS documentation
to learn more about AWS Lambdas and DLQs.
Lambda with X-Ray Tracing
import lambda = require('@aws-cdk/aws-lambda');
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NodeJS810,
handler: 'index.handler',
code: lambda.Code.inline('exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'),
tracing: lambda.Tracing.Active
});
See the AWS documentation
to learn more about AWS Lambda's X-Ray support.
Lambda with Reserved Concurrent Executions
import lambda = require('@aws-cdk/aws-lambda');
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NodeJS810,
handler: 'index.handler',
code: lambda.Code.inline('exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'),
reservedConcurrentExecutions: 100
});
See the AWS documentation
managing concurrency.