AWS CloudFormationで管理しているAmazon RDSのメジャーアップグレードを実施する

こんにちは。サービスグループの武田です。CloudFormationで管理しているRDSをメジャーアップグレードする際に少しハマったため、遭遇した事象と解決策を紹介します。
2020.06.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

AWS CloudFormationで管理しているAmazon RDS for MySQLを5.6から5.7にメジャーアップグレードする機会がありました。アップグレード自体はそこまで手間もなく行えます。

今回は次の2点が前述したエントリと異なり、またハマった箇所でもあります。

  • AWS CloudFormationで管理している
  • カスタムパラメーターグループを使用している

具体的なハマりポイントと解決策を紹介します。

MySQL 5.6を構築する

まずは移行前のMySQL 5.6を構築するCloudFormationテンプレートを用意します。検証なのでデフォルトVPCを使用しています。実行する場合はSubnetIdsに実在するIDを指定してください。

rds.template.yml

Resources:
  DBInstance:
    Type: AWS::RDS::DBInstance
    DeletionPolicy: Snapshot
    Properties:
      AllocatedStorage: '5'
      DBInstanceClass: db.t3.medium
      DBParameterGroupName: !Ref DBParameterGroup
      DBSubnetGroupName: !Ref DBSubnetGroup
      Engine: MySQL
      EngineVersion: 5.6.46
      MasterUsername: admin
      MasterUserPassword: your_secret
      StorageType: gp2

  DBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: custom subnet group
      SubnetIds:
        - subnet-aaaaaaaa
        - subnet-bbbbbbbb
        - subnet-cccccccc

  DBParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: custom paramter group
      Family: MySQL5.6
      Parameters:
        character_set_database: utf8mb4
        character_set_client: utf8mb4
        character_set_connection: utf8mb4
        character_set_results: utf8mb4
        character_set_server: utf8mb4

スタックを作成するとRDSが構築できます。

MySQL 5.7にアップグレードする

RDSのメジャーアップグレードをする際に注意すべき点は次の2点です。

  1. AllowMajorVersionUpgrade=trueプロパティの指定
  2. MySQL5.7 Familyのパラメーターグループが必要

1はCloudFormationのドキュメントに記載があります。これを指定し忘れるとアップグレードに失敗します。

2はRDSのドキュメントから引用します。

カスタムパラメータグループを使用する場合は、新しい DB エンジンバージョンで、デフォルトのパラメータグループを指定するか、独自のカスタムパラメータグループを作成します。

もともとデフォルトのパラメーターグループを使用している場合は特に気にする点はありません。一方でカスタムパラメーターグループを使用している場合は、アップグレード後のFamilyで新しいパラメーターグループを用意する必要があります。CloudFormationで管理している場合はどうすればいいでしょうか。

私は始め次のような修正をしてスタックの更新を試みました。

@@ -4,11 +4,12 @@
     DeletionPolicy: Snapshot
     Properties:
       AllocatedStorage: '5'
+      AllowMajorVersionUpgrade: true
       DBInstanceClass: db.t3.medium
       DBParameterGroupName: !Ref DBParameterGroup
       DBSubnetGroupName: !Ref DBSubnetGroup
       Engine: MySQL
-      EngineVersion: 5.6.46
+      EngineVersion: 5.7.28
       MasterUsername: admin
       MasterUserPassword: your_secret
       StorageType: gp2
@@ -26,7 +27,7 @@
     Type: AWS::RDS::DBParameterGroup
     Properties:
       Description: custom paramter group
-      Family: MySQL5.6
+      Family: MySQL5.7
       Parameters:
         character_set_database: utf8mb4
         character_set_client: utf8mb4

しかしこれは失敗します。スタック更新の理由には次のようなエラーメッセージが出ていました。

The following parameters are not defined for the specified group: offline_mode, max_points_in_geometry, max_digest_length, log_timestamps, max_execution_time, ngram_token_size, performance_schema_max_memory_classes, mecab_rc_file, performance_schema_max_index_stat, performance_schema_max_prepared_statements_instances, performance_schema_max_program_instances, performance_schema_max_table_lock_stat, log_syslog_tag, performance_schema_events_transactions_history_size, performance_schema_events_transactions_history_long_size, mysql_native_password_proxy_users, performance_schema_max_metadata_locks, performance_schema_max_sql_text_length, performance_schema_max_statement_stack, log_syslog_include_pid (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 1a0a07e9-e7c5-447a-940a-ea9f1b834dd2)

このエラーメッセージを見て調べたりしてたのですが、しばらく原因がさっぱりわかりませんでした。原因は、前述したようにFamilyが異なる場合 新しいDBエンジンバージョンで、独自のカスタムパラメーターグループを作成 する必要があるためです。先ほどの修正では、既存のパラメーターグループを更新しようとし、それはできない操作なので失敗してしまいます。

そんなわけで、テンプレートの修正は次のようになりました。名前を変えることによって、新しいパラメーターグループに置き換わります。

@@ -4,11 +4,12 @@
     DeletionPolicy: Snapshot
     Properties:
       AllocatedStorage: '5'
+      AllowMajorVersionUpgrade: true
       DBInstanceClass: db.t3.medium
-      DBParameterGroupName: !Ref DBParameterGroup
+      DBParameterGroupName: !Ref DBParameterGroup57
       DBSubnetGroupName: !Ref DBSubnetGroup
       Engine: MySQL
-      EngineVersion: 5.6.46
+      EngineVersion: 5.7.28
       MasterUsername: admin
       MasterUserPassword: your_secret
       StorageType: gp2
@@ -22,11 +23,11 @@
         - subnet-8b9b60c2
         - subnet-52d9877a

-  DBParameterGroup:
+  DBParameterGroup57:
     Type: AWS::RDS::DBParameterGroup
     Properties:
       Description: custom paramter group
-      Family: MySQL5.6
+      Family: MySQL5.7
       Parameters:
         character_set_database: utf8mb4
         character_set_client: utf8mb4

スタックを更新すると問題なく進みます。

20分程度経ち、無事にアップグレードが完了しました。

まとめ

CloudFormationおよびRDSの仕様でわからない部分があり少しハマりました。とはいえ、たったこれだけの変更でDBのアップグレードが完了できてすばらしいですね!どなたかの参考になれば幸いです。