Terraformを利用したMySQLバージョンアップの注意点

はじめに

こんにちは。CCI インフラチームのOGAWAです。

Terraformを利用してRDSのMySQLのバージョンアップを行う場合、

1. 既存RDSの変更
2. スナップショットからのRDS構築+変更

この二つの方法でバージョンアップができます。

この二つをそれぞれ検証し、
発生したエラーと解消方法を共有します。

  1. MySQLのバージョンをあげるときは、
    バージョンアップに関わる項目の値を許可する形で設定する
    オプショングループとパラメータグループの値はバージョンアップ後の値を指定する

  2. MySQLをスナップショットから作成する形でバージョンをあげるときは、
    オプショングループとパラメータグループの値はバージョンアップ前の値を指定する

今回は以下ブログ記事の続編となります。

techblog.cartaholdings.co.jp

目次

1. 検証その1
 ・ 既存RDSのMySQLをバージョンアップ
 ・発生したエラー
2. 検証その2
 ・スナップショットからRDSを構築する際にMySQLをバージョンアップ
 ・発生したエラー
3. Terraformを利用したMySQLバージョンアップの注意点

1. 検証その1

既存RDSのMySQLをバージョンアップ

では、その1から始めます。

【目的】
terraformを使用してRDSのMySQLバージョンアップができるか確認する

【方法】
検証環境にてMySQL5.7のRDSを構築し、Terraformファイルにてバージョンアップを行う

検証環境サーバにログインし、RDSのMySQLをバージョンアップする内容の
Terraformファイルを作成し、apply実行しました。

# 検証前に作成したrds.tf    抜粋
  resource "aws_db_instance" "stg-db" {  
 ~~ 省略   ~~    
   allow_major_version_upgrade           = false
   apply_immediately = false 
   option_group_name                     = "default:mysql-5-7"  
   parameter_group_name                  = "default.mysql5.7" 
 ~~ 省略   ~~  
 }  

発生したエラー

基本的な項目は事前に先輩方がRDSを構築した時の資料からお借りして作成したのですが、
初回、applyを実行したところさっそくエラーが発生しました。

Error: updating RDS DB Instance (XXXXX): operation error RDS: ModifyDBInstance, https response error StatusCode: 400, RequestID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, api error InvalidParameterCombination: The AllowMajorVersionUpgrade flag must be present when upgrading to a new major version.  

allow_major_version_upgrade(メジャーバージョンアップグレード)の値が
falseになっていました。

trueに修正して再実行します。

 allow_major_version_upgrade = true   
今度は実行できたのに、ブラウザに全く反映されません。
再度コードを確認したところ、
apply_immediately(DB変更内容即時反映)設定がfalseになっていました。

これでは実行後にすぐ変更内容が反映されないので、trueに変更して再実行します。

 apply_immediately = true   

今度はバージョンアップがブラウザに反映されました!
しかし、よく見ると

option_group_name(オプショングループ)とparameter_group_name(パラーメータグループ)の
バージョンが以前のままです。

修正して、再度apply実行したところ…

 option_group_name = "default:mysql-8-0"   
 parameter_group_name = "default.mysql8.0"   

想定通り、バージョンアップができました!

3. 検証その2

スナップショットからRDSを構築する際にMySQLをバージョンアップ

続いて、その2です。

【目的】
Terraformを使用してスナップショットからRDSを構築するのと同時
MySQLバージョンアップができるか確認する

【方法】
MySQL5.7のRDSスナップショットを作成し
TerraformファイルにてRDS構築と同時にバージョンアップを行う

検証環境サーバにログインし、MySQLをバージョンアップする内容でRDS構築を行う
Terraformファイルを作成し、apply実行しました。

# 検証前に作成したrds.tf   抜粋
  resource "aws_db_instance" "stg-db" {  
 ~~ 省略   ~~ 
   option_group_name                     = "default:mysql-8-0"  
   parameter_group_name                  = "default.mysql8.0" 
 ~~ 省略   ~~  
 }  

発生したエラー

項目は検証その1から大きく変更せず、snapshot_identifier(スナップショットの元ファイル)を
指定したところ、次のようなエラーが出ました。

option_group_name(オプショングループ)が現DBのエンジンバージョンと合わないらしく
バージョンを設定していた8-0から5-7に修正してapply実行しました。

 option_group_name                     = "default:mysql-5-7"
またエラーです。

parameter_group_name(パラメータグループ)が現DBのエンジンバージョンと合わないらしく
こちらもバージョンを設定していた8.0から5.7に修正してapply実行してみたところ…

 parameter_group_name                  = "default.mysql5.7"   

想定通り、バージョンアップができました!

ブラウザ画面上で確認したところ、MySQLのバージョンだけでなく
オプショングループもパラメータグループもバージョンアップされていました。

どうやら、オプショングループとパラメータグループは現行のバージョンを指定することで
エンジンバージョンにて指定したバージョンに自動的にアップデート
されるようです。

実行後のtfstateファイル上では、オプショングループとパラメータグループの値は
バージョンアップ後の値に修正されていました。
apply実行後にrds.tfの値もtfstateと同バージョンに修正し
plan実行して差分が出ないことを確認することをお勧めします。

 option_group_name                     = "default:mysql-8-0"
 parameter_group_name                  = "default.mysql8.0"   

3. Terraformを利用したMySQLバージョンアップの注意点

改めて、今回の検証を通した注意点は以下2点となります。

  1. MySQLのバージョンをあげるときは、
    バージョンアップに関わる項目の値を許可する形で設定する
    オプショングループとパラメータグループの値はバージョンアップ後の値を指定する

  2. MySQLをスナップショットから作成する形でバージョンをあげるときは、
    オプショングループとパラメータグループの値はバージョンアップ前の値を指定する