将 AWS cdk 堆栈重构为多个较小的堆栈

问题描述 投票:0回答:1

我当前的 cdk 堆栈已达到资源限制,需要重构为更小的堆栈。我想在不分离现有资源的情况下做到这一点。我的数据库尤其如此。

我当前的堆栈部署了一个包含堡垒主机、API 网关和相应的 lambda、一些 dynamodb 表和 neptune 数据库的 vpc,并配置了所有必要的权限。尤其是 API 网关正在耗尽我的全部资源限制。

为了解决这个问题,我想将堆栈的各个部分重构为更小的堆栈。重构堆栈(当前为 LambdaStack 和 ApiGatewayStack)中声明的资源与现有单堆栈中的资源声明相同。重构后的顶层堆栈如下所示:

export class MyStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: MyStackProps | any) {
    super(scope, id, props);

    dotenv.config();

    const { deploymentEnvironment } = props || { deploymentEnvironment: 'dev' };
    const isDev = deploymentEnvironment === 'dev';

    const vpcId = `NeptuneVPC${isDev ? 'Dev' : 'Prod'}`;
    const vpc = new ec2.Vpc(this, vpcId, {
      maxAzs: 2,
      // subnetConfiguration: [
      //   {
      //     cidrMask: 24,
      //     name: 'public',
      //     subnetType: ec2.SubnetType.PUBLIC,
      //   },
      //   {
      //     name: 'private',
      //     subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
      //   },
      // ],
    });

    const bastionName = `NeptuneBastionHost${isDev ? 'Dev' : 'Prod'}`;
    const bastionHost = this.createBastionHost(
      vpc,
      bastionName,
      `key-pair-neptune-bastion-${isDev ? 'dev' : 'prod'}`,
    );

    const lambdaStack = new LambdaStack(this, 'LambdaStack', {
      deploymentEnvironment,
      vpc,
    });

    const apiGatewayStack = new ApiGatewayStack(this, 'ApiGatewayStack', {
      deploymentEnvironment,
      vpc,
      lambdaStack,
    });

    const s3PublicBucket = new s3.Bucket(this, `my-${isDev ? 'dev' : 'prod'}-images`, {
      blockPublicAccess: new s3.BlockPublicAccess({
        blockPublicAcls: false,
        blockPublicPolicy: false,
        ignorePublicAcls: false,
        restrictPublicBuckets: false,
      }),
      objectOwnership: s3.ObjectOwnership.OBJECT_WRITER,
    });

    // S3
    s3PublicBucket.grantPublicAccess();
    s3PublicBucket.grantWrite(lambdaStack.mainLambda);
    s3PublicBucket.grantPutAcl(lambdaStack.mainLambda);

    // Dynamo, Neptune, etc...

我特别担心孤立或删除现有资源,所以我想知道:

  1. 我重构到自己堆栈的资源会被删除并重新部署吗?我的直觉是肯定的。
  2. 我留在顶层堆栈中的资源会被保留吗?这一部分尤其重要,因为它们代表了我所有的核心数据库。
  3. 如果我想将有状态资源(数据库和存储桶)移动到自己的堆栈而不删除和重新创建,我该怎么做?

问题的根源是:cdk如何决定一个资源是指现有资源还是新资源?

javascript node.js aws-cloudformation aws-cdk
1个回答
0
投票

我重构到自己堆栈的资源会被删除并重新部署吗?我的直觉是肯定的。

是的。

我留在顶层堆栈中的资源会被保留吗?这一部分尤其重要,因为它们代表了我所有的核心数据库。

如果您没有更改它们,它们将不会更改。

如果我想将有状态资源(数据库和存储桶)移动到自己的堆栈而不删除和重新创建,我该怎么做?

您必须研究 CDK import,以便在将它们从旧堆栈中孤立出来后将它们导入到新堆栈中(将

removalPolicy
属性设置为
RemovalPolicy.RETAIN
)。

cdk如何判断一个资源是指现有资源还是新资源?

CDK 不会决定这一点 - 您告诉它是否要创建资源(例如

new Bucket()
或引用现有资源(例如
Bucket.fromBucketArn()
)。请注意,后者不会将资源导入到堆栈中 - 它只是允许您的 CDK 代码以只读方式引用它。

当代码中有

new Bucket
时,它如何知道是否需要创建新存储桶 - 这部分发生在 CDK 之外和 CloudFormation 中,这就是保持状态的原因。它将检查该资源是否已由该堆栈创建,如果已创建,则不会尝试再次创建它。不过,它不会检查该资源是否存在 - 它只会检查相关堆栈的先前操作

© www.soinside.com 2019 - 2024. All rights reserved.