【问题标题】:AWS CDK Deploying to stage without deleting previous stagesAWS CDK 在不删除先前阶段的情况下部署到阶段
【发布时间】:2021-05-28 12:57:11
【问题描述】:

我正在使用 AWS CDK 来管理我的 API Gateway 的部署。我使用阶段通过环境来推广我的代码,例如开发、测试、预生产、生产。我的脚本看起来像这样:

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 网关中只有一个阶段。

是否可以在不删除其他阶段的情况下部署到一个阶段?

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation aws-api-gateway aws-cdk


    【解决方案1】:

    当您部署相同的堆栈时,部署和阶段的id 会因不同的 stageName 参数而发生变化。 Cloudformation 将删除以前的资源并创建一个新资源。

    您需要将代码分成 2 个堆栈以使其正常工作。 堆栈 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,
        });
    

    保持 MyStack2 idmy-api-deployment-stack-${stageName} 一样。

    这样做的目的是您将拥有一个带有 api 网关的通用堆栈和每个 env 的不同堆栈,例如 dev、test、preprod 和 prod。

    【讨论】:

      【解决方案2】:

      这是我注意到的:

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

      所以,简而言之,我们需要两个阶段,两个部署,并根据动态逻辑名称控制部署哪一个。 代码将如下所示:

      这里是完整的代码:

      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
      

      【讨论】:

      • 好的,那么如果我想让 StageOne 与我分配的上一个 Deployment 保持静态并仅为 StageTwo 创建一个新的 Deployment,同时保持两种状态呢?
      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2022-06-12
      相关资源
      最近更新 更多