首页 > 解决方案 > 自定义 VPC 子网的 RDS 问题

问题描述

我正在尝试使用 CDK 定义无服务器 Postgres Aurora 集群,但一直遇到关于 VPC 子网“无效”或“不存在”的问题,具体取决于我尝试使用的数据库集群构造。在我的设置中,我有 2 个堆栈:1 个用于 VPC,1 个用于 RDS。

这是我的 Vpc 堆栈的内容:

const vpc = new Vpc(this, 'Vpc');

const privateSubnetIds = vpc.selectSubnets({
    subnetType: SubnetType.PRIVATE
}).subnetIds;

const rdsSecurityGroup = new SecurityGroup(this, 'RdsSecurityGroup', {
    securityGroupName: 'rds-security-group',
    allowAllOutbound: true,
    description: `RDS cluster security group`,
    vpc: vpc
});

...

// The rest of the file defines exports.

情况1:

最初,我尝试使用CfnDBClusterasDatabaseCluster不允许您直接定义engineMode: 'serverless'and enableHttpEndpoint: true。以下是使用该CfnDBCluster构造的 RDS 堆栈的内容:

// The beginning of the file imports all the VPC exports from the VPC Stack:
//   subnetIds (for the private subnet), securityGroupId
...

const databaseSecret = new DatabaseSecret(this, 'secret', {
    username: 'admin'
});

const secretArn = databaseSecret.secretArn;

const dbSubnetGroup = new CfnDBSubnetGroup(this, "DbSubnetGroup", {
    dbSubnetGroupDescription: `Database cluster subnet group`,
    subnetIds: subnetIds
});

const dbCluster = new CfnDBCluster(this, 'DbCluster', {
    dbClusterIdentifier: 'aurora-cluster',
    engine: 'aurora-postgresql',
    engineMode: 'serverless',
    databaseName: DB_NAME,
    masterUsername: databaseSecret.secretValueFromJson('username').toString(),
    masterUserPassword: databaseSecret.secretValueFromJson('password').toString(),
    enableHttpEndpoint: true,
    scalingConfiguration: {
        autoPause: true,
        minCapacity: 1,
        maxCapacity: 16,
        secondsUntilAutoPause: 300
    },
    vpcSecurityGroupIds: [securityGroupId],
    dbSubnetGroupName: dbSubnetGroup.dbSubnetGroupName
});

使用该CfnDBCluster构造,我收到以下错误:

Some input subnets in :[subnet-044631b3e615d752c,subnet-05c2881d9b13195ef,subnet-03c63ec89ae49a748] are invalid. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 5c4e6237-6527-46a6-9ed4-1bc46c38dce0)

我能够在 RDS 堆栈运行之前验证这些子网确实存在。

案例二:

在无法使CfnDBCluster上面的示例正常工作后,我尝试使用DatabaseCluster带有原始覆盖的构造。以下是使用该DatabaseCluster构造的 RDS 堆栈的内容:

// The beginning of the file imports all the VPC exports from the VPC Stack:
//   subnetIds (for the private subnet), securityGroupId, vpcId, AZs, vpc (using Vpc.fromAttributes)
...

const dbCluster = new DatabaseCluster(this, 'DbCluster', {
    engine: DatabaseClusterEngine.auroraPostgres({
        version: AuroraPostgresEngineVersion.VER_10_7
    }),
    masterUser: {
        username: databaseSecret.secretValueFromJson('username').toString(),
        password: databaseSecret.secretValueFromJson('password')
    },
    instanceProps: {
        vpc: vpc,
        vpcSubnets: {
            subnetType: SubnetType.PRIVATE
        }
    },
});

const cfnDbCluster = dbCluster.node.defaultChild as CfnDBCluster;
cfnDbCluster.addPropertyOverride('DbClusterIdentifier', 'rds-cluster');
cfnDbCluster.addPropertyOverride('EngineMode', 'serverless');
cfnDbCluster.addPropertyOverride('DatabaseName', DB_NAME);
cfnDbCluster.addPropertyOverride('EnableHttpEndpoint', true);
cfnDbCluster.addPropertyOverride('ScalingConfiguration.AutoPause', true);
cfnDbCluster.addPropertyOverride('ScalingConfiguration.MinCapacity', 1);
cfnDbCluster.addPropertyOverride('ScalingConfiguration.MaxCapacity', 16);
cfnDbCluster.addPropertyOverride('ScalingConfiguration.SecondsUntilAutoPause', 300);
cfnDbCluster.addPropertyOverride('VpcSecurityGroupIds', subnetIds);

使用该DatabaseCluster构造,我收到以下错误:

There are no 'Private' subnet groups in this VPC. Available types:

我能够验证 VPC 确实有一个私有子网,我还验证了它是否已正确导入并且子网都具有预期的标签,即 key: 'aws-cdk:subnet-type' value: 'Private'

这个问题让我感到困惑和困惑,我无法弄清楚为什么会出现这些问题,并且希望能提供帮助解决此问题的任何指导。

参考:

笔记:

标签: amazon-web-servicesamazon-rdsamazon-vpcamazon-auroraaws-cdk

解决方案


如果您在获得后访问此页面 -

Some input subnets in :[subnet-XXXX,subnet-YYYY,subnet-ZZZZ] are invalid.

您可能检查并确认这些子网不存在,并努力寻找这些子网的来源。

CDK 仍然指向这些子网的原因cdk.context.json是它仍然包含上次部署的值。

文档-

上下文值是可以与堆栈或构造相关联的键值对。AWS CDK 使用上下文缓存来自您的 AWS 账户的信息,例如您账户中的可用区或用于启动您的实例的 Amazon 系统映像 (AMI) ID。

将所有 JSON 内容替换为有效内容 ( {}) 并重新部署堆栈。


推荐阅读