Obávaná chyba AWS:Nelze najít verzi xx.x pro postgres

Při vytváření zásobníku AWS obsahujícího postgresovou databázovou tabulku se může zobrazit tato chyba:

Chyba

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

Chybný kód

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

Nyní tento kód chyby:InvalidParameterCombination a zpráva:Cannot find version 12.3 for postgres není příliš explicitní a nevysvětluje, o jaký skutečný problém jde.

Chyba ve skutečnosti znamená, že verze 12.3 for postgres je odepsán a jakýkoli odkaz na tuto verzi nebo jakoukoli verzi, se kterou máte problém, by měl být z vašeho kódu odstraněn a nahrazen podporovanou verzí.

Skutečný problém

AWS vyžaduje, abyste při vytváření databáze uvedli číslo verze. AWS však neuchovává všechny verze této databáze donekonečna.

AWS odepisuje určité verze, takže někdy v budoucnu budete muset změnit kód, aby používal podporovanou verzi této databáze.

Jak chybu opravit?

Uveďte podporovanou verzi databáze

Opravený kód:verze 1

| Jednoduchý kód |

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

Opravený kód:verze 2

Pokud nechcete ve svém kódu zavádět tvrdé hodnoty, u kterých se očekává, že se změní, použijte verzi 2 opravy.

| Oprava vyššího kódu |


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

Jak zjistit, které verze databáze jsou odepisovány a podporovány

  • Navštivte web AWS

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

Obrázek:Zastaralé verze 12.x postgres
  • nebo spusťte níže uvedený kód AWS CLI

Po spuštění příkazu přejděte úplně na konec seznamu, abyste viděli nejnovější verzi databáze podporovanou AWS

aws rds describe-db-engine-versions --engine postgres --output table 
Obrázek:AWS CLI pohled na aktuální verzi postgres

Kód vytvoření zásobníku AWS (obsahuje chybu)

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

Kód pro vytvoření zásobníku AWS (pevný kód)

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