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

CDK部署后如何自动生成导出ApiGateway的Swagger JSON文件

解决方案

1 CfnDocumentationPart报错修复

错误触发规则:API Gateway的RESOURCE类型文档部位仅支持path参数,不允许携带method、statusCode、name字段。你需要配置405响应说明,应将location.type修改为RESPONSE类型,正确代码如下:

import * as apigateway from 'aws-cdk-lib/aws-apigateway';

// 你的RestApi实例定义
const api = new apigateway.RestApi(this, 'mycomRestApi', {
  deployOptions: {
    stageName: 'prod'
  }
});

new apigateway.CfnDocumentationPart(this, 'siteDocs', {
  restApiId: api.restApiId,
  location: {
    type: 'RESPONSE', // 替换为RESPONSE类型
    method: '*',
    path: '/',
    statusCode: '405'
  },
  // 建议用JSON.stringify避免模板字符串格式错误
  properties: JSON.stringify({
    status: "error",
    code: 405,
    message: "Method Not Allowed"
  })
});

如果仅需要给指定路径的资源加整体说明、不需要绑定方法和状态码,使用RESOURCE类型时去掉method、statusCode字段即可。

2 部署后自动导出Swagger JSON实现方案

推荐用CDK原生的部署钩子实现,无需额外自定义资源,配置步骤如下:

步骤1:在CDK栈中添加必要参数输出

// 输出API ID和部署阶段名,供后续命令调用
new cdk.CfnOutput(this, 'RestApiId', {
  value: api.restApiId
});
new cdk.CfnOutput(this, 'RestApiStage', {
  value: api.deploymentStage.stageName
});

步骤2:配置CDK部署后钩子

修改项目根目录的cdk.json,新增postdeploy钩子配置:

{
  "app": "npx ts-node --prefer-ts-exts bin/你的项目入口文件名.ts",
  // 原有watch、context配置保留不变
  "hooks": {
    "postdeploy": [
      "aws apigateway get-export --parameters extension='integrations' --rest-api-id $(aws cloudformation describe-stacks --stack-name 你的CDK栈名 --query \"Stacks[0].Outputs[?OutputKey=='RestApiId'].OutputValue\" --output text) --export-type swagger --accepts application/json --stage-name $(aws cloudformation describe-stacks --stack-name 你的CDK栈名 --query \"Stacks[0].Outputs[?OutputKey=='RestApiStage'].OutputValue\" --output text) swagger_new.json"
    ]
  }
}

配置完成后,每次执行cdk deploy完成后会自动执行导出命令,将Swagger定义输出到项目根目录的swagger_new.json文件中。

注意:执行环境需要提前配置好对应AWS账号的访问凭证,且已安装AWS CLI工具。

内容的提问来源于stack exchange,提问作者James Black

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:18:02