LoginSignup
1
0

More than 1 year has passed since last update.

【Aurora PostgreSQL】メジャーバージョンアップ時に CloudFormation で管理する DB パラメータグループを更新する

Last updated at Posted at 2022-05-22

初めに

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.

ナレッジセンターにトラブルシューティングの記載があります。

更新時のエラー

cfn-6.png

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 クラスターを手動で変更します。

アップグレードしたいクラスターを選択し、「変更」をクリックします。

upgrade-1.png

エンジンバージョンをアップグレード先バージョンに変更します。

upgrade-2.png

「すぐに適用」をクリックします。

upgrade-3.png

アップグレードが始まるので完了するまで待ちます。

upgrade-4.png

アップグレードが完了したことを確認します。

upgrade-5.png

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

変更セットを作成します。

change-set-1.png

編集したテンプレートをアップロードします。

change-set-2.png

DBEngineVersion の値はアップグレード先バージョンを選択します。

change-set-7.png

変更内容を確認します。

change-set-9.png

実行をクリックします。

change-set-5.png

「変更セットを実行」をクリックします。

change-set-6.png

変更セット実行後、CFn のパラメータ更新と、古い DB パラメータグループが削除されていることを確認します。

  • CFn パラメータ更新

更新前

cfn-2.png

更新後

cfn-3.png

  • 古い DB パラメータグループが削除されていること

更新前

cfn-5.png

更新後

cfn-4.png

考慮事項

スタック更新時のインスタンスの挙動

2 回目のスタック更新時、DB インスタンスのステータスが「変更中」となっていました。

update-stack-1.png

その後、インスタンスは再起動されました。

update-stack-2.png

スタック更新前後で作成したインスタンスが初期化されるのではと思いましたが、スタック更新前に作成したテーブルはスタック更新後も残っていました。これは 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 クラスターの更新に失敗するようです。

cfn-7.png

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.

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0