我当前的 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...
我特别担心孤立或删除现有资源,所以我想知道:
问题的根源是:cdk如何决定一个资源是指现有资源还是新资源?
我重构到自己堆栈的资源会被删除并重新部署吗?我的直觉是肯定的。
是的。
我留在顶层堆栈中的资源会被保留吗?这一部分尤其重要,因为它们代表了我所有的核心数据库。
如果您没有更改它们,它们将不会更改。
如果我想将有状态资源(数据库和存储桶)移动到自己的堆栈而不删除和重新创建,我该怎么做?
您必须研究 CDK import,以便在将它们从旧堆栈中孤立出来后将它们导入到新堆栈中(将
removalPolicy
属性设置为 RemovalPolicy.RETAIN
)。
cdk如何判断一个资源是指现有资源还是新资源?
CDK 不会决定这一点 - 您告诉它是否要创建资源(例如
new Bucket()
或引用现有资源(例如 Bucket.fromBucketArn()
)。请注意,后者不会将资源导入到堆栈中 - 它只是允许您的 CDK 代码以只读方式引用它。
当代码中有
new Bucket
时,它如何知道是否需要创建新存储桶 - 这部分发生在 CDK 之外和 CloudFormation 中,这就是保持状态的原因。它将检查该资源是否已由该堆栈创建,如果已创建,则不会尝试再次创建它。不过,它不会检查该资源是否存在 - 它只会检查相关堆栈的先前操作