DEV Community

Automate Post-Deployment Tasks with `cdkTrigger` in AWS CDK

Deploying infrastructure with AWS CDK is powerful — but sometimes, you want something more than just resources in place. Maybe you want to:

  • Seed a database after deployment
  • Populate an S3 bucket with default data
  • Kick off a workflow
  • Or simply validate that everything deployed successfully

That's where the cdk-triggers module comes in. In this post, we'll walk through how to use cdk.triggers.Trigger to automatically invoke a Lambda function after a successful CDK deployment.


🔧 What is cdk.triggers.Trigger?

The Trigger construct is part of the aws-cdk-lib.triggers module. It allows you to run a Lambda automatically after your stack is deployed — great for bootstrapping and post-deploy configuration tasks.


🧪 Example: Run a Lambda After Resources Are Created

Let’s say you’re deploying:

  • An S3 bucket
  • A DynamoDB table
  • A Lambda that seeds a database

You want the Lambda to run after all the resources are successfully created.

Step 1: Import Required Modules

import * as cdk from "aws-cdk-lib"; import * as lambda from "aws-cdk-lib/aws-lambda"; import * as s3 from "aws-cdk-lib/aws-s3"; import * as dynamodb from "aws-cdk-lib/aws-dynamodb"; import * as triggers from "aws-cdk-lib/triggers"; import { Construct } from "constructs"; 
Enter fullscreen mode Exit fullscreen mode

Step 2: Define the Stack

export class MyStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // S3 bucket const bucket = new s3.Bucket(this, "MyBucket"); // DynamoDB table const table = new dynamodb.Table(this, "MyTable", { partitionKey: { name: "id", type: dynamodb.AttributeType.STRING }, }); // Lambda function to run post-deploy const seedFunction = new lambda.Function(this, "SeedFunction", { runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", code: lambda.Code.fromAsset("lambda/seed"), timeout: cdk.Duration.minutes(5), environment: { BUCKET_NAME: bucket.bucketName, TABLE_NAME: table.tableName, }, }); bucket.grantReadWrite(seedFunction); table.grantReadWriteData(seedFunction); // Create the trigger const cdkTrigger = new triggers.Trigger(this, "SeedTrigger", { handler: seedFunction, timeout: cdk.Duration.minutes(10), invocationType: triggers.InvocationType.EVENT, // async invocation }); // Define dependencies – only run trigger after these resources are created cdkTrigger.executeAfter(bucket); cdkTrigger.executeAfter(table); } } 
Enter fullscreen mode Exit fullscreen mode

🔁 How It Works

During deployment, CDK will:

  1. Deploy your stack’s resources (bucket, table, Lambda).
  2. Automatically invoke the seedFunction via the trigger.
  3. Ensure it runs only once (unless you opt to re-run it).

🛠 Notes & Best Practices

  • The Trigger construct deploys a custom resource under the hood.
  • The invocationType can be:

    • EVENT: Asynchronous (default and recommended for non-critical background jobs)
    • REQUEST_RESPONSE: Wait for result (useful for critical tasks, but can cause stack rollback on failure)
  • You can use cdkTrigger.executeAfter(...) to control execution order and guarantee your resources are ready.

  • To re-run the trigger every deploy, set cdkTrigger.trigger.runOnUpdate = true.


🧹 Optional: Clean Up After Execution

By default, the Lambda and the trigger stay in place. If you want to clean up the Lambda after running:

cdkTrigger.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY); 
Enter fullscreen mode Exit fullscreen mode

Or consider separating your post-deployment logic into a one-time stack.


✅ Summary

cdk.triggers.Trigger is a great way to kick off post-deployment automation in a clean, repeatable way.

Use it to:

  • Seed databases
  • Initialize state
  • Validate configs
  • Or automate any once-per-deploy logic

No need for separate scripts or manual steps — just CDK.


📁 Example Directory Structure

my-app/ ├── bin/ │ └── my-app.ts ├── lib/ │ └── my-stack.ts ├── lambda/ │ └── seed/ │ └── index.ts 
Enter fullscreen mode Exit fullscreen mode

🧪 Want to Try It?

Make sure you have the triggers module installed:

npm install aws-cdk-lib constructs 
Enter fullscreen mode Exit fullscreen mode

That’s it! Happy automating with CDK! ⚙️

Top comments (0)