Typescript 如何在AWS CDK中使用API网关部署中的现有阶段?

Typescript 如何在AWS CDK中使用API网关部署中的现有阶段?,typescript,amazon-web-services,aws-api-gateway,aws-cdk,Typescript,Amazon Web Services,Aws Api Gateway,Aws Cdk,我有一个现有的API网关,包含资源和阶段。我正在通过aws cdk向其添加一个新资源。网关配置为deploy:false,因此我必须手动为其创建新的部署。我可以导入网关,但在Stage类中找不到类似的方法(fromLookup?)。我知道我可以创建一个新的阶段,但它听起来不像是一个可扩展的解决方案 代码如下: const api = apigateway.RestApi.fromRestApiAttributes(this, 'RestApi', { restApiId: 'XXX',

我有一个现有的API网关,包含资源和阶段。我正在通过aws cdk向其添加一个新资源。网关配置为deploy:false,因此我必须手动为其创建新的部署。我可以导入网关,但在Stage类中找不到类似的方法(fromLookup?)。我知道我可以创建一个新的阶段,但它听起来不像是一个可扩展的解决方案

代码如下:

const api = apigateway.RestApi.fromRestApiAttributes(this, 'RestApi', {
  restApiId: 'XXX',
  rootResourceId: 'YYYY',
});

const deployment = new apigateway.Deployment(this, 'APIGatewayDeployment', {
  api,
});

// How to get an existing stage here instead of creating a new one?
const stage = new apigateway.Stage(this, 'test_stage', {
  deployment,
  stageName: 'dev',
});

api.deploymentStage = stage;

今天我遇到了同样的问题,但我发现如果为部署资源设置stageName属性,它将使用现有的stage

如果您查看部署资源的CloudFormation文档,它有一个StageName属性()

但是如果您检查CDK的部署实现,它不支持stageName属性(),并且通过遵循部署类上的扩展,它将从构造函数中需要stageName值的CfnResource进行扩展

因此,通过执行以下操作,我最终强制部署资源选择我想要的值:

const-api=apigateway.RestApi.fromRestapiAttribute(这是“RestApi”{
restApiId:'XXX',
rootResourceId:'YYYY',
});
const deployment=new apigateway.deployment(这是“APIGatewayDeployment”{
应用程序编程接口,
});
deployment.resource.stageName='YourStageName';

对我来说,问题是部署正在更新API的资源,而不是阶段的资源。修复方法是每次创建一个新的部署ID:

// Create deployment with ID based on current date
const deployment = new apigw.Deployment(this, 'deployment-' + new Date().toISOString(), { api });
  
// Deploy to existing API & stage  
const stage = new apigw.Stage(this, 'stage-alpha', { deployment, stageName: 'alpha' });
api.deploymentStage = stage
使用您发布的代码,您应该在Stage>Deployment History选项卡中看到,在您为其提供唯一ID之前,它不会添加新部署


注意:这可能不太理想,因为它在每次运行
cdk deploy
时都会部署更新,即使没有进行其他更改

“资源”对我来说是部署对象的私有属性。Typescript不允许它编译。@Connor它只对Typescript是私有的,Typescript类型只在编译时计算。这意味着我们可以不使用
(任何部署)