De gevreesde AWS-fout:kan versie xx.x voor postgres niet vinden

Bij het maken van een AWS-stack die een postgres-databasetabel bevat, kunt u deze foutmelding krijgen:

Fout

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

Foutieve code

const engine = DatabaseInstanceEngine.postgres({ version: PostgresEngineVersion.VER_12_3 });

Nu deze foutcode:InvalidParameterCombination , en het bericht:Cannot find version 12.3 for postgres is niet erg expliciet en legt niet uit wat het echte probleem is.

Wat de fout eigenlijk betekent, is dat versie 12.3 voor postgres wordt afgeschreven en elke verwijzing naar die versie, of een versie waarmee u een probleem ondervindt, moet uit uw code worden verwijderd en worden vervangen door een ondersteunde versie.

Het echte probleem

AWS vereist dat u het versienummer voor de database opgeeft wanneer deze wordt gemaakt. AWS houdt echter niet alle versies van die database voor onbepaalde tijd bij.

AWS schrijft bepaalde versies af, dus op een bepaald moment in de toekomst zult u de code moeten wijzigen om een ​​ondersteunde versie te gebruiken van die database.

Hoe kan ik de fout herstellen?

Geef een ondersteunde versie van de database op

Vaste code:versie 1

| Eenvoudige code |

const engine = DatabaseInstanceEngine.postgres({ version: PostgresEngineVersion.VER_14_2 });

Vaste code:versie 2

Gebruik versie 2 van de fix, als je niet van hardcore waarden in je code houdt die naar verwachting zullen veranderen.

| Superieure codecorrectie |


/**
* 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,
    ),
  });

Hoe weet u welke versies van de database worden afgeschreven en ondersteund

  • Bezoek de AWS-website

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html

Afbeelding:afgeschreven 12.x-versies van postgres
  • of Voer de AWS CLI-code hieronder uit

Blader na het uitvoeren van de opdracht helemaal naar het einde van de lijst om de meest recente versie van de database te zien die door AWS wordt ondersteund

aws rds describe-db-engine-versions --engine postgres --output table 
Afbeelding:AWS CLI-weergave van de huidige versie van postgres

Aanmaakcode AWS-stack (bevat fout)

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,
    });
  }
}

Aanmaakcode AWS-stack (vaste 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,
    });
  }
}