Writing clean, observable, and maintainable Lambda functions can be challenging — especially at scale.
That’s where AWS Lambda Powertools for TypeScript comes in. It offers a suite of utilities to help with:
- Structured logging
- Distributed tracing
- Custom metrics
- Parameter and secret fetching
- Reusable data providers (like DynamoDB)
In today’s post, we’ll walk through how to use some of the most useful features in a real-world Lambda function.
🧰 Installation
First, install Powertools packages:
npm install @aws-lambda-powertools/logger @aws-lambda-powertools/tracer @aws-lambda-powertools/metrics @aws-lambda-powertools/parameters
Optional (for DynamoDB provider):
npm install @aws-sdk/client-dynamodb
📝 Structured Logging with Logger
import { Logger } from '@aws-lambda-powertools/logger';
const logger = new Logger({ serviceName: 'UserService' });
export const handler = async (event) => {
logger.info('Handling event', { event });
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello World!' }),
};
};
✅ Output is JSON-formatted and ready for CloudWatch, Datadog, or other log aggregators.
📦 Tracing with Tracer
import { Tracer } from '@aws-lambda-powertools/tracer';
const tracer = new Tracer({ serviceName: 'UserService' });
export const handler = async (event, context) => {
const segment = tracer.getSegment();
const subsegment = segment.addNewSubsegment('my-subtask');
try {
// your logic here
} finally {
subsegment.close();
}
return { statusCode: 200 };
};
💡 Tracer integrates with AWS X-Ray automatically if enabled.
📈 Metrics with Metrics
import { Metrics, MetricUnits } from '@aws-lambda-powertools/metrics';
const metrics = new Metrics({ namespace: 'MyApp' });
export const handler = async () => {
metrics.addMetric('SuccessfulInvocations', MetricUnits.Count, 1);
metrics.publishStoredMetrics();
return { statusCode: 200 };
};
🎯 Automatically flushes metrics to CloudWatch.
🔑 Fetching Parameters with getParameter
import { getParameter } from '@aws-lambda-powertools/parameters/ssm';
export const handler = async () => {
const dbName = await getParameter('/my-app/db-name');
return {
statusCode: 200,
body: JSON.stringify({ dbName }),
};
};
✅ You can also cache parameters:
await getParameter('/my-app/db-name', { maxAge: 300 }); // cache for 5 mins
🗃 DynamoDB Provider
import { getDynamoDBProvider } from '@aws-lambda-powertools/parameters/dynamo';
const dynamoDBProvider = getDynamoDBProvider({ tableName: 'Settings' });
export const handler = async () => {
const setting = await dynamoDBProvider.get('theme'); // get row with PK 'theme'
return {
statusCode: 200,
body: JSON.stringify({ theme: setting?.value }),
};
};
💡 Great for config-driven apps with DynamoDB as your parameter store.
Conclusion
With Powertools for TypeScript, your Lambdas are:
- ✅ Easier to debug (thanks to structured logging)
- ✅ Easier to monitor (custom metrics)
- ✅ Easier to trace (end-to-end with X-Ray)
- ✅ Easier to configure (via SSM or DynamoDB)
It’s a must-have for production-grade serverless development.