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.
Top comments (0)