MySQL5.7から8.0へのアップデートをterraformで検証した話

はじめに

こんにちは。
ほとんど初めましての人しかいないと思いますが、CCI インフラチームの kesatokesato です。
この記事が読まれているということは、すでにこの記事は公開されているということでしょう。

私は今、このブログを書くのに物凄く苦戦しています。
最近はMarkdownの編集を使うようになったのですが、【これどうやって表現するんだっけ?】を調べながらやっているので、通常の三倍くらいブログを書くのに時間がかかっています。

でも、色々と使えるように自分をアップデートしていかないといけないわけですね。
ここ、すごくいいことを言いましたので太字です。
調べながら作成しているので、リアルタイムで知識のアップデートがされました。

さて、アップデートと言えばMySQL5.7のEOLが今年の10月に迎えますので、MySQL8.0にしなければならないという話に結び付くと思います。

長い前置きはこの話に繋げるためだけに考えたので、読み飛ばしてもらっても全然大丈夫です。
前置きの終わり際に言うので、大半の人は読み飛ばせない形になっている二段構えの構成になっております。

terraform import

実はterraformを利用し始めたのは最近で、利用しているMySQL5.7についてはコンソールから作成したものとなっております。
コンソールから作成しているならコンソールからバージョンアップした方が早いのでは? という指摘はその通りですが、terraformの検証なのでterraformを使います。

すでにコンソールで作成しているものをterraformで作るなんてことができるのか!? と思う人はあまりいないかもしれませんし、やっぱりできます。
そのコマンドは下記です。

$ terraform import aws_db_instance.default mydb-rds-instance

こちらのコマンドはterraformのサイトに記載ございます。

【引用元】Terraform Registry Resource: aws_db_instance
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance

指定した情報からimportを行って、terraform.tfstateを作成してくれます。

terraform によるDBアップデート

先の項目でRDSの情報のimportを実施しましたので、次に作るのはtfファイルです。
terraformで最初から作成する場合には考える必要もないですが、今回はimportから作成しているので、現環境と同じtfファイルを作成する必要があります。

terraform.tfstateの中身を確認すれば、何が必要なのか分かるので、そこからtfファイルを作っていきます。
ちなみにこれは私が一番最初にやった方法ですが、terraform planの結果がNo changesとなるまで調整していく……という過程がありました。
後から知りましたが、下記のコマンドを使用すれば、tfファイルの中身を簡単に作ることができます。

$ terraform show

実際にコマンドを打つと、terraform.tfstateの内容次第で長くなるので中略しますが、下記のように情報が取得できます。

    address                               = "address"
    allocated_storage                     = 30
    allow_major_version_upgrade           = true
    apply_immediately                     = true
    arn                                   = "test"
    auto_minor_version_upgrade            = false
    availability_zone                     = "availability_zone"
    backup_retention_period               = 7
    backup_window                         = "14:08-14:38"
    ca_cert_identifier                    = "ca_cert_identifier"
    copy_tags_to_snapshot                 = true
    customer_owned_ip_enabled             = false
    db_subnet_group_name                  = "test"
    delete_automated_backups              = true
    deletion_protection                   = false
    enabled_cloudwatch_logs_exports       = [
        "audit",
        "error",
        "general",
        "slowquery",
    ]
    endpoint                              = "endpoint:3306"
    engine                                = "mysql"
    engine_version                        = "5.7.38"
~中略~

得られた情報から、設定に必要なところだけを抜け出してtfファイルに記載していく感じです。
今まで細かく確認していたのはなんだったんだ……ってなりますが、それはそれでtfファイルを修正する勉強になったので良しとします。

情報も得られたので、あとは8.0の設定を入力するだけですが、DBを作成する上でaws_db_parameter_groupも必要になります。
これも公式に取得する方法がございますので、そのコマンドを利用させていただきます。

$ terraform import aws_db_parameter_group.rds_pg rds-pg

【引用元】Terraform Registry Resource: aws_db_parameter_group
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_parameter_group

DBのパラメータグループの情報を手に入れたら、既存のMySQL5.7のパラメータグループの情報とアップデート後に利用するMySQL8.0のパラメータグループの情報をtfファイルに記載します。

当たり前ですが、5.7と8.0のバージョンで利用するパラメータグループのバージョンが違うので必要です。
5.7のRDSの情報をimportした以上は、関連するものも引っ張ってこなければならないということですね。

ここまで来れば、terraform planで変更箇所を確認して、terraform applyで反映すればバージョンアップできます。
ちなみにRDSのマスターユーザを削除している場合には、事前に復活させる必要があるので注意が必要です。
マスターユーザなんて削除していない、なら特に気にしなくて大丈夫な点です。

バージョンアップの検証を経て

このようにして、既存のRDSをterraformにてバージョンアップする検証を行いました。
terraformの使い方を覚えるのに非常に役立った検証だったと感じています。

ちなみにMySQL8.0.32のバージョンアップを実施したのですが、なんとたまたまDBのバグを引いたので別バージョンで再構築することになりました。
アップデートは慎重に行いましょう(綺麗なオチ)。