Как интегрировать Api Gateway и Step Fucnctions в CDK? - PullRequest
0 голосов
/ 27 января 2020

У меня есть машина состояний.

        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. Я использовал приведенный ниже код, и он выдает ошибку типа «Statemacine не присваивается параметру тип AwsIntegrationProps '

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

Мой запрос интеграции шлюза API выглядит в консоли следующим образом.

enter image description here

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Ошибка 'statemacine не может быть назначена параметру типа AwsIntegrationProps' относится к вашему экземпляру.

AwsIntegration класс принимает AwsIntegrationProps struct as input.

new AwsIntegration(props: AwsIntegrationProps)

Получение API Gateway для запуска Step Функции напрямую немного странны. Я нашел это Учебное пособие по созданию API-функций с использованием API Gateway полезным. Конечный автомат ARN передается в теле запроса вызова, поэтому вам нужно передать шаблон запроса, если вы не хотите, чтобы пользователь указывал конечный автомат.

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 иgrationResponses для параметров, чтобы получить мои настройки так, как я хотел.

0 голосов
/ 27 января 2020

Вы должны использовать apigateway.LambdaIntegration, который расширяет AwsIntegration.

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 .

...