背景

RDSのPostgresqlのバージョンは12.19を使用しています。バージョン12は2025年2月末でサポート終了を迎えます。(参考:Amazon RDS for Postgre のリリースカレンダーSQL - Amazon Relational Database Service)

サポート終了となっても使えるのですが、サポート延長費用を支払う必要があります。これがけっこうバカにならない。。。

最新バージョンは17.2なので、これにバージョンアップできるのか、そして何か不具合があった場合に戻せるのかをざっと検証しようと考えました。

厳密な検証というより、感覚を掴むためのざっくりとした検証です。

検証用に作成したリポジトリ。terraformでRDSを作ってくれます。

yamadatt/-Volumes-git-rds-verup-poc

マネコンからやってみた

12.19から16.3にアップデート

12.19から17.2にはあげられないです。一方、16.3ならいけそうなので、16.3にアップします。

変更のスケジュールは「すぐに適用」を選択します。

ステータスが「変更中」のまま、なかなか変わりません。

やっと「利用可能」となりました。

ここまでで約10分でした。何もデータを入れていないので、それが効いているのかもしれないです。まぁ、目安として。

terraformでアップデート

terraformでもアップデートできるか確認してみました。

残念ながら、terraformでメジャーバージョンをアップデートできませんでした。しかし、マイナーバージョンならできることを確認できました。マイナーは12.19から12.22へのアップを確認しました。

以下は12.19から16.3にアップデートできるか確認した記録です。

Terraform will perform the following actions:

  # module.db.aws_db_instance.db will be updated in-place
  ~ resource "aws_db_instance" "db" {
      ~ engine_version                        = "12.19" -> "16.3"
        id                                    = "db-BSJTGVNKYRYUR6VZGB7D2SE5HE"
        tags                                  = {}
        # (69 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

このようなメッセージでNGでした。

│ Error: updating RDS DB Instance (stag-db): operation error RDS: ModifyDBInstance, https response error StatusCode: 400, RequestID: 6bb4a1f2-93f9-42c7-a920-7f902ac05f66, api error InvalidParameterCombination: The AllowMajorVersionUpgrade flag must be present when upgrading to a new major version.
│ 
│   with module.db.aws_db_instance.db,
│   on ../modules/db/database.tf line 81, in resource "aws_db_instance" "db":
│   81: resource "aws_db_instance" "db" {
│ 

切り戻しできるか

16.3から12.19に戻せるかどうか確認します。

残念ながら、以下のように選択肢に出てこなくて戻せないです。バージョンアップするしかないです。

terraformなら戻せるか

マネコンだったら切り戻せないけど、もしかしてterraformなら戻せるかも。と淡い期待を抱いて試してみました。

バージョンが"16.3" -> "12.19"と表示されているので、なんとなく戻せそうな気がします。

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # module.db.aws_db_instance.db will be updated in-place
  ~ resource "aws_db_instance" "db" {
      ~ engine_version                        = "16.3" -> "12.19"
        id                                    = "db-B3BGYUI76PXOD4ML73QF4DPTJI"
        tags                                  = {}
        # (69 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

applyしてみましたが、エラーでNGでした。

│ Error: updating RDS DB Instance (stag-db): operation error RDS: ModifyDBInstance, https response error StatusCode: 400, RequestID: a80b4e4a-d743-41df-8bff-7a7bfdd6ff34, api error InvalidParameterCombination: Cannot upgrade postgres from 16.3 to 12.19
│ 
│   with module.db.aws_db_instance.db,
│   on ../modules/db/database.tf line 81, in resource "aws_db_instance" "db":
│   81: resource "aws_db_instance" "db" {
│ 

検証結果

バージョンアップはできるけど、バージョンダウンはできなそうというのがわかりました。

他にやり方があるのかもしれないと思って、Chat-GPTに聞いてみると以下の回答でした。ダウンはできないようです。

Amazon RDS の PostgreSQL エンジンでは、エンジンのバージョンダウン(ダウングレード)は 直接実行できません。RDS はアップグレードのみをサポートしており、ダウングレードは公式にはサポートされていないため、以下の方法で対応する必要があります。

参考

利用可能な RDS エンジンのバージョンを AWS CLI で確認できます。

aws rds describe-db-engine-versions --engine postgres --query "DBEngineVersions[*].[EngineVersion]" --output text

私の場合はこんな感じに出力されます。

11.22
11.22-rds.20240418
11.22-rds.20240509
11.22-rds.20240808
11.22-rds.20241121
12.15
12.16
12.17
12.18
12.19
12.20
12.21
12.22
13.15
13.16
13.17
13.18
14.12
14.13
14.14
14.15
15.7
15.8
15.9
15.10
16.3
16.4
16.5
16.6
17.1
17.2