如何在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
这里:
我有一个状态机。
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
这里: