AWS CDK如何跨栈获取其他栈定义的HTTP API的HttpRoute
核心原因
通过HttpApi.fromHttpApiAttributes()导入的跨栈HTTP API实例是只读的轻量引用,CDK不会递归加载该API下的所有路由构造,因此你无法直接从导入的API实例挂载的属性上获取已有路由的HttpRoute对象。
解决方案
你只需要在定义路由的栈A额外导出目标路由的ID,在栈B通过HttpRoute.fromHttpRouteAttributes()手动构造路由引用即可,不需要遍历API资源。
栈A侧修改
在定义/convert路由后,将路由ID作为CloudFormation导出值暴露:
// 栈A原有/convert路由定义 const convertRoute = httpApi.addRoutes({ path: '/convert', methods: [HttpMethod.GET, HttpMethod.POST], integration: new HttpLambdaIntegration("ConvertHandler", convertLambda) })[0]; // 新增:导出路由ID供其他栈引用 new cdk.CfnOutput(this, "ConvertRouteIdExport", { value: convertRoute.routeId, exportName: "CurrencyConvertRouteId" });
你之前已经导出了API ID,保留原有导出逻辑即可。
栈B侧导入
导入API实例后,引入路由ID即可构造出可用的HttpRoute实例:
// 你原有导入API的代码 const httpApiId = cdk.Fn.importValue("CurrencyApiId"); const api = HttpApi.fromHttpApiAttributes(this, "api", { httpApiId }); // 新增:导入路由ID,构造目标路由实例 const convertRouteId = cdk.Fn.importValue("CurrencyConvertRouteId"); const convertRoute = HttpRoute.fromHttpRouteAttributes(this, "ImportedConvertRoute", { httpApi: api, routeId: convertRouteId, routePath: "/convert" // 可选,传入后CDK会做路径匹配校验 });
补充说明
- 不要尝试通过遍历导入API实例的属性获取路由:跨栈导入的资源不会携带原栈的构造树信息,所有子资源都需要显式导出对应属性后手动构造引用。
- 上述方式得到的
convertRoute实例和栈A原生定义的路由实例用法完全一致,可以正常用来绑定授权器、配置路由策略、添加IAM权限等。 - 如果你的需求只是在栈B给同一个HTTP API新增其他路由,不需要导入已有
/convert路由,直接调用导入的api.addRoutes()方法即可,新路由会自动关联到同一个API资源。
内容的提问来源于stack exchange,提问作者florian norbert bepunkt
相关产品推荐
相关产品推荐

