CdkAWS

AWS Lambda (CDK TypeScript)

AWS CDK stack deploying a Lambda function with IAM role, CloudWatch log group, and HTTP API Gateway.

cdklambdatypescriptserverless

Prerequisites

  • Node.js >= 18
  • AWS CDK CLI: `npm install -g aws-cdk`
  • AWS credentials configured
  • CDK bootstrapped: `cdk bootstrap aws://ACCOUNT_ID/REGION`

Template Code

// ─────────────────────────────────────────────────────────────────────────────
// AWS CDK — Lambda + HTTP API Gateway
// File: lib/lambda-stack.ts
// ─────────────────────────────────────────────────────────────────────────────

import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';
import * as integrations from 'aws-cdk-lib/aws-apigatewayv2-integrations';
import * as logs from 'aws-cdk-lib/aws-logs';
import { Construct } from 'constructs';

export class LambdaStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // ── CloudWatch Log Group ────────────────────────────────────────────────
    const logGroup = new logs.LogGroup(this, 'ApiHandlerLogs', {
      logGroupName: '/aws/lambda/api-handler',
      retention: logs.RetentionDays.TWO_WEEKS,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    // ── Lambda Function ─────────────────────────────────────────────────────
    const apiHandler = new lambda.Function(this, 'ApiHandler', {
      functionName: 'api-handler',
      runtime: lambda.Runtime.NODEJS_20_X,
      handler: 'index.handler',
      code: lambda.Code.fromAsset('src/lambda'),  // Your handler code directory
      memorySize: 256,
      timeout: cdk.Duration.seconds(30),
      logGroup,
      environment: {
        NODE_ENV: 'production',
        LOG_LEVEL: 'info',
      },
    });

    // ── HTTP API Gateway ────────────────────────────────────────────────────
    const httpApi = new apigatewayv2.HttpApi(this, 'HttpApi', {
      apiName: 'my-http-api',
      corsPreflight: {
        allowHeaders: ['Content-Type', 'Authorization'],
        allowMethods: [
          apigatewayv2.CorsHttpMethod.GET,
          apigatewayv2.CorsHttpMethod.POST,
          apigatewayv2.CorsHttpMethod.PUT,
          apigatewayv2.CorsHttpMethod.DELETE,
        ],
        allowOrigins: ['*'],
        maxAge: cdk.Duration.hours(1),
      },
    });

    // Route all requests to the Lambda function
    httpApi.addRoutes({
      path: '/{proxy+}',
      methods: [apigatewayv2.HttpMethod.ANY],
      integration: new integrations.HttpLambdaIntegration('ApiIntegration', apiHandler),
    });

    // ── Outputs ─────────────────────────────────────────────────────────────
    new cdk.CfnOutput(this, 'ApiUrl', {
      value: httpApi.apiEndpoint,
      description: 'HTTP API endpoint URL',
    });

    new cdk.CfnOutput(this, 'LambdaArn', {
      value: apiHandler.functionArn,
      description: 'Lambda function ARN',
    });
  }
}

// ── Entry point (bin/app.ts) ──────────────────────────────────────────────────
// import * as cdk from 'aws-cdk-lib';
// import { LambdaStack } from '../lib/lambda-stack';
//
// const app = new cdk.App();
// new LambdaStack(app, 'LambdaStack', {
//   env: {
//     account: process.env.CDK_DEFAULT_ACCOUNT,
//     region:  process.env.CDK_DEFAULT_REGION,
//   },
// });

Usage

npm install
cdk deploy LambdaStack