初めに
Aurora PostgreSQL のメジャーバージョンアップの際、CFn で管理している DB パラメータグループの更新がうまくいかなかったのでどうするか考えました。
DB パラメータグループの更新
DB パラメータグループ更新に関する CFn のドキュメント
パラメータグループの Family はスタック更新では更新できないことが記載されています。
The DB parameter group family can't be changed when updating a DB parameter group.
クラスターパラメータグループについても同様です。
The DB cluster parameter group family can't be changed when updating a DB cluster parameter group.
ナレッジセンターにトラブルシューティングの記載があります。
更新時のエラー
The following parameters are not defined for the specified group: enable_partitionwise_aggregate, babelfishpg_tds.listen_addresses, enable_parallel_append, cron.max_running_jobs, enable_incremental_sort, enable_partition_pruning, log_parameter_max_length_on_error, cron.log_statement, log_min_duration_sample, apg_enable_semijoin_push_down, cron.database_name, cron.log_run, log_parameter_max_length, enable_parallel_hash, hash_mem_multiplier, babelfishpg_tds.tds_debug_log_level, cron.use_background_workers, enable_partitionwise_join (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue;)
更新手順
前提条件
Aurora PostgreSQL 10.20 を以下のテンプレートで作成するとします。簡単に各セクションについてまとめます。
- Resource セクション
- Aurora クラスター、Aurora インスタンス、Aurora DB クラスターパラメータグループ、Aurora DB パラメータグループ
- Parameters セクション
- DB エンジンバージョン
- Mappings セクション
- パラメータグループファミリー
AWSTemplateFormatVersion: 2010-09-09
Parameters:
DBEngineVersion:
Type: String
Default: '10.20'
AllowedValues:
- '10.20'
- '13.6'
Mappings:
DBFamilyMap:
'10.20':
family: aurora-postgresql10
'13.6':
family: aurora-postgresql13
Resources:
AuroraDBCluster:
Type: 'AWS::RDS::DBCluster'
Properties:
Engine: aurora-postgresql
EngineMode: provisioned
EngineVersion: !Ref DBEngineVersion
DBClusterParameterGroupName: !Ref DBClusterParameterGroup
MasterUsername: postgres
MasterUserPassword: PostgresAdmin1!
AuroraDBInstance:
Type: 'AWS::RDS::DBInstance'
Properties:
Engine: aurora-postgresql
DBInstanceClass: db.t3.medium
DBClusterIdentifier: !Ref AuroraDBCluster
DBParameterGroupName: !Ref DBParameterGroup
DBClusterParameterGroup:
Type: 'AWS::RDS::DBClusterParameterGroup'
Properties:
Description: Aurora PostgreSQL Cluster Parameter Group
Family: !FindInMap
- DBFamilyMap
- !Ref DBEngineVersion
- family
Parameters:
timezone: Asia/Tokyo
DBParameterGroup:
Type: 'AWS::RDS::DBParameterGroup'
Properties:
Description: Aurora PostgreSQL Parameter Group
Family: !FindInMap
- DBFamilyMap
- !Ref DBEngineVersion
- family
1. 手動アップグレードを行う
ドキュメントに以下のように記載があるので CloudFormation を使わずに手動でアップグレードします。
メジャーバージョンのアップグレードには、以前のバージョンのデータベースと下位互換性のないデータベースの変更が含まれる場合があります。その場合、既存のアプリケーションが適切に動作しなくなることがあります。そのため、Amazon Aurora では、メジャーバージョンアップグレードは自動的に適用されません。メジャーバージョンのアップグレードを行うには、DB クラスターを手動で変更します。
アップグレードしたいクラスターを選択し、「変更」をクリックします。
エンジンバージョンをアップグレード先バージョンに変更します。
「すぐに適用」をクリックします。
アップグレードが始まるので完了するまで待ちます。
アップグレードが完了したことを確認します。
2. CFn のパラメータ更新とパラメータグループを更新する
以下のテンプレートで変更セットを作成します。
AWSTemplateFormatVersion: 2010-09-09
Parameters:
DBEngineVersion:
Type: String
Default: '10.20'
AllowedValues:
- '10.20'
- '13.6'
Mappings:
DBFamilyMap:
'10.20':
family: aurora-postgresql10
'13.6':
family: aurora-postgresql13
Resources:
AuroraDBCluster:
Type: 'AWS::RDS::DBCluster'
Properties:
Engine: aurora-postgresql
EngineMode: provisioned
EngineVersion: !Ref DBEngineVersion
DBClusterParameterGroupName: !Ref DBClusterParameterGroupPostgreSQL13
MasterUsername: postgres
MasterUserPassword: PostgresAdmin1!
AuroraDBInstance:
Type: 'AWS::RDS::DBInstance'
Properties:
Engine: aurora-postgresql
DBInstanceClass: db.t3.medium
DBClusterIdentifier: !Ref AuroraDBCluster
DBParameterGroupName: !Ref DBParameterGroupPostgreSQL13
DBClusterParameterGroupPostgreSQL13:
Type: 'AWS::RDS::DBClusterParameterGroup'
Properties:
Description: Aurora PostgreSQL Cluster Parameter Group
Family: !FindInMap
- DBFamilyMap
- !Ref DBEngineVersion
- family
Parameters:
timezone: Asia/Tokyo
DBParameterGroupPostgreSQL13:
Type: 'AWS::RDS::DBParameterGroup'
Properties:
Description: Aurora PostgreSQL Parameter Group
Family: !FindInMap
- DBFamilyMap
- !Ref DBEngineVersion
- family
変更セットを作成します。
編集したテンプレートをアップロードします。
DBEngineVersion
の値はアップグレード先バージョンを選択します。
変更内容を確認します。
実行をクリックします。
「変更セットを実行」をクリックします。
変更セット実行後、CFn のパラメータ更新と、古い DB パラメータグループが削除されていることを確認します。
- CFn パラメータ更新
更新前
更新後
- 古い DB パラメータグループが削除されていること
更新前
更新後
考慮事項
スタック更新時のインスタンスの挙動
2 回目のスタック更新時、DB インスタンスのステータスが「変更中」となっていました。
その後、インスタンスは再起動されました。
スタック更新前後で作成したインスタンスが初期化されるのではと思いましたが、スタック更新前に作成したテーブルはスタック更新後も残っていました。これは CFn のドキュメントに更新動作の記述がありました。EngineVersion
の更新動作は「一時的な中断を伴う更新」でしたので、インスタンスが初期化されることはないようです。(変更セットのコンソール画面からも置換列の値が「False」になっていることが確認できます)
Update requires: Some interruptions
AllowMajorVersionUpgrade プロパティ
AWS::RDS::Instance
には AllowMajorVersionUpgrade
というプロパティがあります。
A value that indicates whether major version upgrades are allowed. Changing this parameter doesn't result in an outage and the change is asynchronously applied as soon as possible.
Constraints: Major version upgrades must be allowed when specifying a value for the EngineVersion parameter that is a different major version than the DB instance's current version.
Aurora ではない RDS ではこれまでに書いた手順よりもメジャーバージョンアップが簡単にできるようです。
以下に記載があります。
以下のようなテンプレートでスタックを更新しました。
※DBEngineVersion
はスタック更新時にアップグレード先バージョンに変更します。
AWSTemplateFormatVersion: 2010-09-09
Parameters:
DBEngineVersion:
Type: String
Default: '10.20'
AllowedValues:
- '10.20'
- '13.6'
Mappings:
DBFamilyMap:
'10.20':
family: aurora-postgresql10
'13.6':
family: aurora-postgresql13
Resources:
AuroraDBCluster:
Type: 'AWS::RDS::DBCluster'
Properties:
Engine: aurora-postgresql
EngineMode: provisioned
EngineVersion: !Ref DBEngineVersion
DBClusterParameterGroupName: !Ref DBClusterParameterGroupPostgreSQL13
MasterUsername: postgres
MasterUserPassword: PostgresAdmin1!
AuroraDBInstance:
Type: 'AWS::RDS::DBInstance'
Properties:
Engine: aurora-postgresql
DBInstanceClass: db.t3.medium
AllowMajorVersionUpgrade: true
DBClusterIdentifier: !Ref AuroraDBCluster
DBParameterGroupName: !Ref DBParameterGroupPostgreSQL13
DBClusterParameterGroupPostgreSQL13:
Type: 'AWS::RDS::DBClusterParameterGroup'
Properties:
Description: Aurora PostgreSQL Cluster Parameter Group
Family: !FindInMap
- DBFamilyMap
- !Ref DBEngineVersion
- family
Parameters:
timezone: Asia/Tokyo
DBParameterGroupPostgreSQL13:
Type: 'AWS::RDS::DBParameterGroup'
Properties:
Description: Aurora PostgreSQL Parameter Group
Family: !FindInMap
- DBFamilyMap
- !Ref DBEngineVersion
- family
しかし、以下のようなエラーでスタック更新に失敗しました。AWS::RDS::DBCluster
には AllowMajorVersionUpgrade
プロパティが存在しないので、DB クラスターの更新に失敗するようです。
The current DB instance parameter group aurora-stack-2-dbparametergroup-bm9hsf6qkay4 is custom. You must explicitly specify a new DB instance parameter group, either default or custom, for the engine version upgrade.
参考資料