Aurora(PostgreSQL)のアップグレード

# Aurora(PostgreSQL)のアップグレード

PostgreSQLは1年に1回メジャーバージョンアップし、その後にセキュリティパッチ、バグフィックスなどを含めたマイナーバージョンがリリースされます。メジャーバージョンがリリースされてから5年でEOLを迎えます。

Aurora(PostgreSQL)でも遅れてPostgreSQLのメジャーバージョン、マイナーバージョンがリリースされます。2020年4月時点では、9.6から11.6までのバージョンが利用できます。最新のPostgreSQLは12.2なので、若干古いバージョンになっています。

AWS公式のアップグレードに関する情報は以下のページで確認することができます。

- [Amazon Aurora PostgreSQL のデータベースエンジンの更新](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Updates.html)
- [Amazon RDS の PostgreSQL DB エンジンのアップグレード](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html)


# Amazon Aurora PostgreSQLのバージョンの確認

Auroraには、Auroraとデータベースエンジンの2つのバージョンを持っています。

データベースエンジンのバージョンは、通常のPostgreSQLと同様に以下のように確認できます。
今回は後でアップグレードを試すために少し古いバージョン（10.5）を利用しています。

```
postgres=> SHOW SERVER_VERSION;
 server_version 
----------------
 10.5
(1 row)
```

次のAuroraのバージョンは以下のように確認できます。

```
postgres=> SELECT AURORA_VERSION();
 aurora_version 
----------------
 2.1.1
(1 row)
```

なお、AuroraとPostgreSQLとバージョンの紐づけは以下のページで確認できます。
（Auroraのバージョンを知ると何か良いことがあるのかは分かりませんが。。。）

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Updates.20180305.html


# アップグレードできるバージョンの確認

Auroraをアップグレードできるかどうかは以下のコマンドで確認することができます。

```
aws rds describe-db-engine-versions --engine aurora-postgresql
```

例えば、10.5のバージョンの場合は以下のように出力されます。
「"AutoUpgrade": true」で自動アップグレードの対象かどうかが確認できるようになっているようです。

なお、10.5からは10.6～10.11へバージョンアップができるようです。

```
        {
            "Engine": "postgres",
            "EngineVersion": "10.5",
            "DBParameterGroupFamily": "postgres10",
            "DBEngineDescription": "PostgreSQL",
            "DBEngineVersionDescription": "PostgreSQL 10.5-R1",
            "ValidUpgradeTarget": [
                {
                    "Engine": "postgres",
                    "EngineVersion": "10.6",
                    "Description": "PostgreSQL 10.6-R1",
                    "AutoUpgrade": true,
                    "IsMajorVersionUpgrade": false
                },
                {
                    "Engine": "postgres",
                    "EngineVersion": "10.7",
                    "Description": "PostgreSQL 10.7-R1",
                    "AutoUpgrade": false,
                    "IsMajorVersionUpgrade": false
                },
～省略～
                {
                    "Engine": "postgres",
                    "EngineVersion": "10.11",
                    "Description": "PostgreSQL 10.11-R1",
                    "AutoUpgrade": false,
                    "IsMajorVersionUpgrade": false
                },
                {
                    "Engine": "postgres",
                    "EngineVersion": "11.1",
                    "Description": "PostgreSQL 11.1-R1",
                    "AutoUpgrade": false,
                    "IsMajorVersionUpgrade": true
                },
～省略～
                {
                    "Engine": "postgres",
                    "EngineVersion": "11.6",
                    "Description": "PostgreSQL 11.6-R1",
                    "AutoUpgrade": false,
                    "IsMajorVersionUpgrade": true
                }
            ],
            "ExportableLogTypes": [
                "postgresql",
                "upgrade"
            ],
            "SupportsLogExportsToCloudwatchLogs": true,
            "SupportsReadReplica": true,
            "SupportedFeatureNames": [],
            "Status": "available"
        },
```




# アップグレードの概要

インスタンスのアップグレードには以下の2種類があります。

- メジャーバージョンのアップグレード
- マイナーバージョンのアップグレード


# メジャーバージョンのアップグレード

10.5から11.7へのアップグレードなどがメジャーバージョンのアップグレードです。
メジャーバージョンのアップグレードは下位互換性がなく、標準でサポートされていません。
そのため、別のDBクラスタを構成し、pg_dump/pg_restoreなどを使用して移行する必要があります。

例えば以下の手順が考えられます。

1)現行のスナップショットを取得。
2)現行のクラスタを停止。
3)現行のスナップショットを用いて新規にAuroraクラスタを構築。
4)AuroraのEndpointに切り替える。

アプリケーションからの書き込みがあるとデータに差分が発生するのでアプリケーションは停止しておく必要があります。
この方法ですとダウンタイムが長くなってしまいますので、ダウンタイムを短くしたい場合はAuroraクラスタ間でレプリケーションを行うことになります。


# マイナーバージョンのアップグレード

・マイナーバージョンのアップグレードは下位互換性があります。
　例えば、11.6から11.7にアップグレードする場合です。
・自動アップグレードと手動アップグレードの2種類があります。
・アップグレード時にデータベースは停止状態になります。
・拡張機能はアップグレードされません。拡張機能を更新するためにALTER EXTENSION UPDATE のコマンドを実行します。 


## 自動アップグレード

・DBインスタンスの作成時、変更時に、「マイナーバージョン自動アップグレード」を有効にする、もしくは推奨バージョン未満である場合に自動アップグレードされます。
・自動アップグレードはメンテナンスウィンドウで実行されます。

自動アップグレードで勝手にアップグレードして停止するケースが発生するので、無停止のシステムであれば注意が必要です。


## 手動アップグレードを実行する

手動アップグレードは、メンテナンスウィンドウ中か、すぐに適用するかを選べます。
すぐに適用するを選択した場合、変更直後ではありませんが、可能な限り早くアップグレードが実行されます。
今回は変更の設定をしてから数分後にアップグレードが完了していました。数分間停止したわけではなく、数分後に完了したということで、実際に停止した時間は確認していません。

アップグレードの手順は以下に記載があります。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_UpgradeDBInstance.PostgreSQL.html

コンソールからマイナーバージョンをアップグレードする手順は以下のようになります。
今回は10.5から10.7へのマイナーバージョンのアップグレードを試してみます。

コンソールでアップグレードを実行するデータベースを選択して、「変更」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/c683fbf4-1058-64b7-5251-bc59a3760394.png)

「DBエンジンのバージョン」で変更するバージョンを選択します。
今回は10.6から10.11までが選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/c67e27ea-55be-6932-1e24-6a4407b5b3ce.png)


次に「変更のスケジュール」でメンテナンスウィンドウ中で実行するか、すぐに適用するかを選択します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/9a51dbfc-a43c-8ee9-49b5-8ce26feb9aad.png)

データベースの画面に戻ると、ステータスが変わり、アップグレード待ちの状態になっています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/0e54ae04-8f02-cac2-88cc-9b0e0a9d818f.png)

アップグレード実行後にバージョンを確認すると以下のように10.7へアップグレードされていることが確認できます。

```
postgres=> SHOW SERVER_VERSION;
 server_version 
----------------
 10.7
(1 row)
```

イベントを確認すると、以下のように「Database cluster has been patched」と出力されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/deb1f5aa-fa96-b890-273c-b3df267fad10.png)

最後に拡張機能は自動でアップグレードされませんので、必要に応じて手動でアップグレードします。
現在の拡張機能を確認するには以下のように実行します。

```
postgres=> select * from pg_available_extensions;
             name             | default_version | installed_version |                                                       comment                                                       
------------------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------
 dblink                       | 1.2             |                   | connect to other PostgreSQL databases from within a database
 pg_repack                    | 1.4.3           |                   | Reorganize tables in PostgreSQL databases with minimal locks
 hstore                       | 1.4             |                   | data type for storing sets of (key, value) pairs
 postgis_tiger_geocoder       | 2.4.4           |                   | PostGIS tiger geocoder and reverse geocoder
 pg_visibility                | 1.2             |                   | examine the visibility map (VM) and page-level visibility info
 orafce                       | 3.6             |                   | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS
 prefix                       | 1.2.0           |                   | Prefix Range module for PostgreSQL
 isn                          | 1.1             |                   | data types for international product numbering standards
～省略～
```

installed_versionがdefault_versionより古い場合はアップグレードしておきましょう。（今回はありませんが）
アップグレードするためには以下のコマンドを実行します。

```
ALTER EXTENSION [拡張名] UPDATE TO [新しいバージョン];
```


今回はコンソールからアップグレードを実行しましたが、他にもAWS CLIとRDS APIで変更することができます。



# 参考

- [Amazon Aurora PostgreSQL のデータベースエンジンの更新](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Updates.html)
- [Amazon RDS の PostgreSQL DB エンジンのアップグレード](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html)
- [Aurora PostgreSQL の PostgreSQL DB エンジンのアップグレード](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_UpgradeDBInstance.PostgreSQL.html)