
AWS CloudFormationで管理しているAmazon RDSのメジャーアップグレードを実施する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。サービスグループの武田です。
AWS CloudFormationで管理しているAmazon RDS for MySQLを5.6から5.7にメジャーアップグレードする機会がありました。アップグレード自体はそこまで手間もなく行えます。
今回は次の2点が前述したエントリと異なり、またハマった箇所でもあります。
- AWS CloudFormationで管理している
 - カスタムパラメーターグループを使用している
 
具体的なハマりポイントと解決策を紹介します。
MySQL 5.6を構築する
まずは移行前のMySQL 5.6を構築するCloudFormationテンプレートを用意します。検証なのでデフォルトVPCを使用しています。実行する場合はSubnetIdsに実在するIDを指定してください。
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点です。
AllowMajorVersionUpgrade=trueプロパティの指定MySQL5.7Familyのパラメーターグループが必要
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のアップグレードが完了できてすばらしいですね!どなたかの参考になれば幸いです。










