AWS CDK Typescript, как вызвать пошаговую функцию из лямбды? - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь вызвать пошаговую функцию из лямбды, поэтому у меня есть такая конфигурация:


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 });
  }
}

, и моя лямбда, подключенная к api-шлюзу:

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
  };
}

Кто-нибудь сталкивался с этим?

1 Ответ

2 голосов
/ 03 марта 2020

Кажется, проблема в вашей лямбда-функции:

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

StartExecution, который вы импортируете из CDK, на самом деле является инфраструктурным конструктом. Чтобы совершать звонки через API AWS, вам необходим 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!'})
  })

  ...
}

См. соответствующие документы для получения дополнительной информации. И обязательно дайте вашей лямбде необходимые разрешения для вызова рассматриваемых пошаговых функций.

Надеюсь, это поможет!

...