AWS CDK部署到阶段,而不删除以前的阶段



我使用AWS CDK来管理我的API网关的部署。我使用阶段在环境中推广我的代码,例如DEV, TEST, PREPROD, PROD.我的脚本如下:

export class MyStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const api = new apigateway.SpecRestApi(this, 'my-api', {
deploy: false,
apiDefinition: apigateway.ApiDefinition.fromAsset('path/to/swagger.yaml'),
});
const stageName = this.node.tryGetContext('stageName');
const deployment = new apigateway.Deployment(this, `my-api-deployment-${stageName}`, { api });
new apigateway.Stage(this, `my-api-stage-${stageName}`, {
stageName,
deployment,
});
}
}

不幸的是,当我将代码从一个阶段提升到下一个阶段时,例如cdk deploy --context stageName=PREPROD,前面的阶段被删除了,所以我在API网关中只剩下一个阶段。

是否有可能部署到一个阶段而不删除其他阶段?

由于您正在部署相同的堆栈,并且id的部署和阶段正在为不同的stageName参数更改。Cloudformation将删除以前的资源,并创建一个新的资源。

你需要把你的代码分成两个栈,使它正常工作。栈1将有代码创建api并导出为

export class MyStack1 extends cdk.Stack {
public readonly api: apigateway.SpecRestApi;
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
this.api = new apigateway.SpecRestApi(this, 'my-api', {
deploy: false,
apiDefinition: apigateway.ApiDefinition.fromAsset('path/to/swagger.yaml'),
});

MyStack2将有代码来创建舞台和部署。

在你的bin/App文件中,你需要将api从MyStack1传递到MyStack2构造函数。

export class MyStack2 extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, api: apigateway.SpecRestApi, props?: cdk.StackProps) {
super(scope, id, props);
const stageName = this.node.tryGetContext('stageName');
const deployment = new apigateway.Deployment(this, `my-api-deployment`, { api });
new apigateway.Stage(this, `my-api-stage`, {
stageName,
deployment,
});

Keep MyStack2idlikemy-api-deployment-stack-${stageName}.

这样做的结果是,你将有一个带有api网关的公共堆栈,每个环境有不同的堆栈,如dev,test, preprod和prod。

我注意到:

  • 如果您更改第二个参数,即Cloudformation中资源的逻辑名称,它将始终删除并重新创建。
  • 如果我们需要两个阶段在那里,我们必须有两个不同的物理资源,我们不能只有一个,不断更改名称,它会删除和重新创建它。
  • 部署到阶段不受阶段控制,而是实际部署。因此,保持舞台资源名称为静态,但只有部署是动态的,真正的动态不是stageName。

所以,简而言之,我们需要两个阶段,两个部署,并根据动态逻辑名控制部署哪一个。代码看起来像这样:

下面是完整的代码:

const myRestApi = new apigateway.RestApi(this, "rest-api", {
deploy: false,
});
const methods = myRestApi.root.addMethod(
"ANY",
new apigw.MockIntegration()
);
const StageOneDeploy = this.node.tryGetContext("StageOneDeploy");
const stageOneDeployment = new apigateway.Deployment(
this,
`api-deployment-${StageOneDeploy}`,
{
api: myRestApi,
}
);
stageOneDeployment._addMethodDependency(methods);
new apigateway.Stage(this, `stageOne`, {
stageName: "stageOne",
deployment: stageOneDeployment,
});
const StageTwoDeploy = this.node.tryGetContext("StageTwoDeploy");
const stageTwoDeployment = new apigateway.Deployment(
this,
`api-deployment-${StageTwoDeploy}`,
{
api: myRestApi,
}
);
stageTwoDeployment._addMethodDependency(methods);
new apigateway.Stage(this, `stageTwo`, {
stageName: "stageTwo",
deployment: stageTwoDeployment,
});

和Deploy,我们可以将其更改为要部署到的每个阶段的随机数。

cdk deploy HelloCdkStack --context StageOneDeploy=123456 --context StageTwoDeploy=9493812

最新更新