CDK构建Step Function:如何通过ARN访问跨栈API Gateway?
跨CDK栈调用API Gateway的Step Functions集成方案
CallApiGatewayRestApiEndpoint并非只能调用同栈API,你可以通过以下两种方式实现跨栈调用:
方法一:栈输出导出/导入共享API信息
在API Gateway所在的目标栈中,导出API的核心标识信息:
// API所在栈的代码 import * as apigateway from 'aws-cdk-lib/aws-apigateway'; import * as cdk from 'aws-cdk-lib'; export class ApiStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); const api = new apigateway.RestApi(this, 'ExternalServiceApi'); // 导出API ID和根资源ID,供其他栈导入 new cdk.CfnOutput(this, 'ApiId', { value: api.restApiId, exportName: 'ExternalServiceApiId' }); new cdk.CfnOutput(this, 'ApiRootResourceId', { value: api.root.resourceId, exportName: 'ExternalServiceApiRootResourceId' }); } }
在Step Functions所在的栈中,导入这些输出并创建IRestApi对象:
// Step Functions所在栈的代码 import * as apigateway from 'aws-cdk-lib/aws-apigateway'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; import * as cdk from 'aws-cdk-lib'; export class StepFunctionStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 导入API的标识信息 const apiId = cdk.Fn.importValue('ExternalServiceApiId'); const rootResourceId = cdk.Fn.importValue('ExternalServiceApiRootResourceId'); // 生成符合IRestApi类型的导入对象 const importedApi = apigateway.RestApi.fromRestApiAttributes(this, 'ImportedApi', { restApiId: apiId, rootResourceId: rootResourceId }); // 构建调用API的Step Function任务 const callApiTask = new tasks.CallApiGatewayRestApiEndpoint(this, 'CallExternalApi', { api: importedApi, integrationPattern: sfn.IntegrationPattern.WAIT_FOR_TASK_TOKEN, method: apigateway.HttpMethod.POST, path: '/process-task', // 替换为你的API路径 requestBody: sfn.TaskInput.fromObject({ taskToken: sfn.JsonPath.taskToken, // 自定义业务参数 payload: sfn.JsonPath.stringAt('$.input') }) }); // 后续可将该任务加入Step Function流程 const stateMachine = new sfn.StateMachine(this, 'TaskProcessingMachine', { definition: callApiTask }); } }
方法二:直接通过已知属性构造IRestApi对象
如果你已经明确知道API的restApiId和rootResourceId(可从AWS控制台获取),无需依赖栈导出,直接构造对象:
const importedApi = apigateway.RestApi.fromRestApiAttributes(this, 'ImportedApi', { restApiId: 'your-api-id-here', rootResourceId: 'your-root-resource-id-here' });
注意事项
- 确保Step Functions的执行角色拥有
execute-api:Invoke权限,可通过添加权限策略实现:
stateMachine.addToRolePolicy(new iam.PolicyStatement({ actions: ['execute-api:Invoke'], resources: [`arn:aws:execute-api:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:${apiId}/*/*/*`] }));
WAIT_FOR_TASK_TOKEN模式下,你的API服务需要在处理完成后调用SendTaskSuccess或SendTaskFailure接口,传入任务令牌完成Step Function的等待流程。
内容的提问来源于stack exchange,提问作者jedrzej.kurylo
相关产品推荐
相关产品推荐

