You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:45:37