Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AWS CDK Typescript, how to trigger step function from lambda?

I'm trying to trigger a step-function from a lambda, so I have this configuration:


let DIST_FOLDER = path.join(__dirname, "dist");

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

    // State Machine code

    let executorLambda = new lambda.Function(this, "executorFunction", {
      runtime: lambda.Runtime.NODEJS_12_X,
      handler: "main.handler",
      code: new lambda.AssetCode(path.join(DIST_FOLDER, "executor-lambda")),
      timeout: Duration.seconds(60)
    });

    let executorTask = new Task(this, "executorTask", {
      task: new InvokeFunction(executorLambda)
    });

    let chain = Chain.start(executorTask);

    let stateMachine = new StateMachine(this, "executorStateMachine", {
      definition: chain
    });

    // Back-end and api
    let backend = new lambda.Function(this, "backend", {
      runtime: lambda.Runtime.NODEJS_12_X,
      handler: "main.handler",
      code: new lambda.AssetCode(path.join(DIST_FOLDER, "backend-lambda")),
      environment: {
        STEP_FUNCTION_ARN: stateMachine.stateMachineArn
      }
    });

    new apigateway.LambdaRestApi(this, "strest-api", { handler: backend });
  }
}

and my api-gateway connected lambda is:

import { StartExecution } from "@aws-cdk/aws-stepfunctions-tasks";

export async function handler(event: any, context: any) {
  let env = process.env;
  let STEP_FUNCTION_ARN = env.STEP_FUNCTION_ARN || "STEP_FUNCTION_ARN";
  let body = JSON.stringify({
    msg: "Hello world",
    stepFunctionArn: STEP_FUNCTION_ARN
  });

  let stateMachineExecution = new StartExecution({ // Here I get an error, I don't know how to pass the correct step function arn or resource
    stateMachineArn: STEP_FUNCTION_ARN
  })

  return {
    statusCode: 200,
    body
  };
}

Has anybody experience with this?

like image 515
Oscar Franco Avatar asked Oct 16 '25 12:10

Oscar Franco


1 Answers

The problem appears to be in your Lambda function:

import { StartExecution } from "@aws-cdk/aws-stepfunctions-tasks";

The StartExecution you're importing from the CDK is really the infrastructure construct. In order to make calls agains AWS's APIs you need the AWS SDK:

import { StepFunctions } from 'aws-sdk'

const stepfunctions = new StepFunctions();

export async function handler(event: any, context: any) {
  ...

  stepfunctions.startExecution({
    stateMachineArn: STEP_FUNCTION_ARN,
    name: '...',
    input: JSON.stringify({msg: 'Hello World!'})
  })

  ...
}

See the respective docs for more information. And make sure to give your Lambda the necessary permissions to invoke the Step Functions in question.

Hope that helps!

like image 161
robdasilva Avatar answered Oct 19 '25 03:10

robdasilva