When creating an AWS stack containing a postgres database table, you might received this error:
Error
Cannot find version 12.3 for postgres (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination
Cannot find upgrade path from 14.2 to 12.3. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination
Erroneous code
const engine = DatabaseInstanceEngine.postgres({ version: PostgresEngineVersion.VER_12_3 });
Now this error code : InvalidParameterCombination, and the the message: Cannot find version 12.3 for postgres
is not very explicit and doesn't explain what the real issue is.
What the error really means is that version 12.3 for postgres is depreciated and any reference to that version, or any version you are having an issue with, should be removed from your code and replaced with a supported version.
The real issue
AWS requires that you specify the version number for the database when it is being created. However, AWS doesn't keep all versions of that database around indefinitely.
AWS depreciates certain versions, so at some point in the future you will have to change the code to use a supported version of that database.
How to fix the error?
Specify a supported version of the database
Fixed code: version 1
| Simple code|
const engine = DatabaseInstanceEngine.postgres({ version: PostgresEngineVersion.VER_14_2 });
Fixed code: version 2
Use version 2 of the fix, if you don't like to hardcore values in your code that are expected to change.
| Superior code fix|
/**
* Store values in environment variables
* @see https://www.npmjs.com/package/dotenv
*/
const postgresFullVersion = process.env.POSTGRESFULLVERSION ?? "14.2";
const postgresMajorVersion = process.env.POSTGRESMAJORVERSION ?? "14";
/**
* Generate the postgres engine version from the values in the environment variable
*/
const engine = DatabaseInstanceEngine.postgres({
version: PostgresEngineVersion.of(
postgresFullVersion,
postgresMajorVersion,
),
});
How to know which versions of the database is Depreciated and supported
- Visit the AWS website
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html
Image: Depreciated 12.x versions of postgres |
- or Run the AWS CLI code below
After running the command, scroll all the way to the end of the list to see the most recent version of the database supported by AWS
aws rds describe-db-engine-versions --engine postgres --output table
Image: AWS CLI view of current version of postgres |
AWS stack creation code (contains error)
import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Vpc, InstanceType, InstanceSize, InstanceClass } from 'aws-cdk-lib/aws-ec2';
import { DatabaseInstance, DatabaseInstanceEngine, PostgresEngineVersion } from 'aws-cdk-lib/aws-rds';
class CdkRdsStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const vpc = new Vpc(this, 'TestVpc', {
cidr: '10.192.0.0/16',
maxAzs: 2,
natGateways: 1,
enableDnsHostnames: true,
enableDnsSupport: true
});
//Erroneous Line
//--------------------------
const engine = DatabaseInstanceEngine.postgres({ version: PostgresEngineVersion.VER_12_3 });
//--------------------------
const dbInstance = new DatabaseInstance(this, 'Test_Postgres_CDK', {
engine,
vpc,
iamAuthentication: true,
instanceType: InstanceType.of(
InstanceClass.BURSTABLE3,
InstanceSize.MICRO
),
databaseName: 'test_postgres'
});
new CfnOutput(this, 'dbEndpoint', {
value: dbInstance.instanceEndpoint.hostname,
});
}
}
AWS stack creation code (fixed code)
import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Vpc, InstanceType, InstanceSize, InstanceClass } from 'aws-cdk-lib/aws-ec2';
import { DatabaseInstance, DatabaseInstanceEngine, PostgresEngineVersion } from 'aws-cdk-lib/aws-rds';
class CdkRdsStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const vpc = new Vpc(this, 'TestVpc', {
cidr: '10.192.0.0/16',
maxAzs: 2,
natGateways: 1,
enableDnsHostnames: true,
enableDnsSupport: true
});
//--- Erroneous Line
//const engine = DatabaseInstanceEngine.postgres({ version: PostgresEngineVersion.VER_12_3 });
//simple fix : version 1
//const engine = DatabaseInstanceEngine.postgres({ version: PostgresEngineVersion.VER_14_2 });
//--------------------------
//--- start : superior code fix , version 2
const postgresFullVersion = process.env.POSTGRESMAJORVERSION ?? "14.2";
const postgresMajorVersion = process.env.POSTGRESENGINEVERSION ?? "14";
const engine = DatabaseInstanceEngine.postgres({
version: PostgresEngineVersion.of(
postgresFullVersion,
postgresMajorVersion,
),
});
//--- end : superior code fix
//--------------------------
const dbInstance = new DatabaseInstance(this, 'Test_Postgres_CDK', {
engine,
allowMajorVersionUpgrade: true,
vpc,
iamAuthentication: true,
instanceType: InstanceType.of(
InstanceClass.BURSTABLE3,
InstanceSize.MICRO
),
databaseName: 'test_postgres'
});
new CfnOutput(this, 'dbEndpoint', {
value: dbInstance.instanceEndpoint.hostname,
});
}
}
Top comments (1)
I am using typescript and serverless stack in another project.
This is a sample of the subtle changes I made to the code