如何在CDK中集成Api Gateway和Step Fucnctions?

How to integrate Api Gateway and Step Fucnctions in CDK?

我有一个状态机。

        const task1 = new sfn.Task(this, 'Assign Case', {
            task: new tasks.InvokeFunction(Lambda1),
        });

        const task2 = new sfn.Task(this, 'Close Case', {
            task: new tasks.InvokeFunction(Lambda2),
        });

        const chain = sfn.Chain.start(task1)
            .next(task2);

      const StateMachine = new sfn.StateMachine(this, `StateMachine`, {
            definition: chain
        });

我需要从 Api-gateway 调用这个状态机 resource.I 使用了下面的代码,它抛出了一个错误,比如 'statemacine is not assignable to paramaeter of type AwsIntegrationProps'

 const resource = this.api.root.addResource(path);
 resource.addMethod(method, new apigw.AwsIntegration(handler), { apiKeyRequired: true }); 
 //handler is above statemachine

我的 api 网关集成请求在控制台中看起来像这样。

您应该使用扩展 AwsIntegration 的 apigateway.LambdaIntegration

export declare class LambdaIntegration extends AwsIntegration {
    private readonly handler;
    private readonly enableTest;
    constructor(handler: lambda.IFunction, options?: LambdaIntegrationOptions);
    bind(method: Method): void;
}

例如:

const getBookIntegration = new apigateway.LambdaIntegration(getBookHandler);

稍后,在创建新方法时使用lambdaIntegration

book.addMethod('GET', getBookIntegration);

更多关于 LambdaIntegration

错误 'statemacine is not assignable to paramaeter of type AwsIntegrationProps' 是指您实例化。

AwsIntegration class takes an AwsIntegrationProps 结构作为输入。

new AwsIntegration(props: AwsIntegrationProps)

直接获取 API 网关以启动 Step Functions 有点奇怪。我发现这个 Creating a Step Functions API Using API Gateway 教程很有用。 State Machine ARN在调用的request body中传递,所以如果不想要求用户指定State Machine,需要传递一个请求模板。

resource.addMethod(
    method,
    new apigw.AwsIntegration({
        handler: 'states',
        action: 'StartExecution',
        options: {
            requestTemplates: {
                'application/json': `{
                    "stateMachineArn": "${handler.ref}",
                    "input": "$util.escapeJavaScript($input.body)"
                }`
            },
        },
    }),
    { apiKeyRequired: true }
);

(注意:我正在从 Python 翻译我的代码,所以我不是 100% 专注于 TypeScript 中的字符串。)

我还填写了 credentialsRole、passthroughBehavior 和 integrationResponses 选项,以按照我想要的方式进行我的设置。

检查这里: api to state

这里:

state machine