この記事は公開されてから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点です。
AllowMajorVersionUpgrade=true
プロパティの指定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のアップグレードが完了できてすばらしいですね!どなたかの参考になれば幸いです。