AWS

[AWS] CloudFormationで管理しているRDS for MySQLからAurora MySQLに移行する手順

aws-cloudformation
o_wani
この記事は作成から3年以上経過しているため、内容が古くなっている可能性があります。

AWSのCloudFormationで管理しているRDS for MySQLのリソースがあり、それをAurora MySQLに移行する手順を記載しておく。また、それに伴い、今回はRubyのアプリの更新(データベースの接続先の切替)までを行います。

参考サイト

いつもお世話になっているクラスメソッドの記事:
AWS CloudFormationで管理しているAmazon RDS for MySQLからAmazon Aurora MySQLに移行する手順を整理した

流れとしては、

  1. DB Cluster Parameterグループを作成する

  2. RDS for MySQLのAuroraのリードレプリカを作成する

  3. Auroraのリソースをインポートする

  4. リードレプリカを昇格する

  5. CloudFormationの更新を行う

  6. アプリのデータベース接続を更新する

といった内容となる。
以下、CloudFormation=CFnと略する。

DB Cluster Parameterグループを作成する

文字コード関連を「utf8mb4」、タイムゾーンを「Asia/Tokyo」に設定するためのauroraのパラメータグループの作成を行う。

タイプ:DB Cluster Parameter Group
グループ名:aurora-cluster-param(自分で決める)

aurora-cluster-param

タイムゾーンをAsia/Tokyo

タイムゾーンをAsia/Tokyo に変更する。

タイムゾーン

文字コード関連をutf8mb4

文字コード関連6つをutf8mb4 に変更する。

utf8mb4

  • character_set_client

  • character_set_connection

  • character_set_database

  • character_set_filesystem

  • character_set_results

  • character_set_server

以上のような設定を行い、パラメータグループを作成しておく。

RDS for MySQLのAuroraのリードレプリカを作成する

RDSのスナップショットを作成し、作成後にそのスナップショットをベースに作成するといったことは必要なく、ここではRDSのAuroraリードレプリカを作成することで目的が達成できる。しかもボタン1つでOK。

Auroraリードレプリカを作成する

RDSの[アクション] > [Auroraリードレプリカの作成]を行う。各設定は要件に合わせて選択する。

Auroraリードレプリカを作成

そうすると既存のRDSのリードレプリカとしてAuroraが作成され、自動的にデータが同期されるようになる。便利すぎる。さっそくAuroraリードレプリカを作成する。

インスタンスを選択する

インスタンスを選択

ネットワーク&セキュリティは環境に合わせる

ネットワーク&セキュリティ

データベースの設定する
DBクラスターのパラメータグループは、最初作成したものを設定する。

DBクラスターのパラメータグループ

暗号化は有効にする
今回暗号の有効化はしておく。

Alt text

バックアップ
1日の保存期間としているが、要件に応じて7日などに変更するとOK。

バックアップ

モニタリング

Alt text

Alt text

今回は以上の内容で作成した。

データベースの一覧に戻ると「作成中」となった。

Alt text

約10分後「Preparing-data-migration」、約20分後「移行中」となり

Alt text

約23分後クラスターが「利用可能」となった。

Alt text

約35分後すべて「利用可能」になった。

Alt text

同期するデータの量にもよると思うけど、リードレプリカの作成完了までは少なくとも30分は見込んでおいた方が良さそう。

CFnスタックにインポートする

[CloudFormation]>[スタック]>[スタックアクション:スタックへのリソースのインポート]で作成したリードレプリカを現状のCFnで認識できるようにインポートする。

Alt text

現状のCFnにAurora MySQLの記述を追記したテンプレートをインポートする。

CFnの更新

既存のテンプレートにAurora MySQLの記述を追記する。

※記載例:「DBSubnetGroup」「DBUser」「DBPassword」は別途定義しておく。DBInstanceClassものちのちは変数定義する。

....
....
DBCluster:
Type: AWS::RDS::DBCluster
DeletionPolicy: Retain
Properties:
DBClusterParameterGroupName: aurora-cluster-param
DBSubnetGroupName: !Ref DBSubnetGroup
Engine: aurora-mysql
EngineVersion: 5.7.mysql_aurora.2.07.2
MasterUsername: !Ref DBUser
MasterUserPassword: !Ref DBPassword
DBWriterInstance:
Type: AWS::RDS::DBInstance
DeletionPolicy: Retain
Properties:
DBClusterIdentifier: !Ref DBCluster
DBInstanceClass: db.t2.small
DBSubnetGroupName: !Ref DBSubnetGroup
Engine: aurora-mysql
DBReaderInstance:
Type: AWS::RDS::DBInstance
DeletionPolicy: Retain
Properties:
DBClusterIdentifier: !Ref DBCluster
DBInstanceClass: db.t2.small
DBSubnetGroupName: !Ref DBSubnetGroup
Engine: aurora-mysql
....
....

CFnファイルアップロード

[ファイルの選択]から選んでアップロードし、[次へ]

Alt text

インポートするリソース識別

Aurora MySQLのリソース3つを入力する。

Alt text

識別子を入力する
DBCluster:aurora-cluster
DBReaderInstance:aurora-ap-northeast-1c
DBWriterInstance:aurora

Alt text

スタックの詳細を指定

特に何も変更なしで。

Alt text

特に何も変更なしで。

Alt text

概要をインポート

特に何も変更なしで。

Alt text

下のほうに今回のインポート対象が出てくる。

Alt text

3つ出てくることを確認して[リソースをインポート]を選択する。

Alt text

インポートを確認

リソースに3つインポートされたことを確認した。
「DBCluster」「DBReaderInstance」「DBWriterInstance」

Alt text

Auroraリードレプリカの昇格

Auroraを昇格させる。
※昇格させた時点で、RDSとの同期が解除されることに注意

また、昇格させると同期元であるRDSは「プライマリ」から「インスタンス」に変更される。同期されている場合「プライマリ」のまま。

Alt text

Auroraクラスターを選択し、[アクション] > [昇格]を選択する。

Alt text

[リードレプリカの昇格]を選択する。

Alt text

3分ほどで昇格完了。同期元であるRDS(rds-db)のロールが「プライマリ」から「インスタンス」に変更になった。

rds-db

Rubyアプリのデータベース接続先変更

Rubyアプリの例。CFnでRubyアプリ用に定義している環境変数を更新する。
環境変数として

  • DB_USER

  • DB_DATABASE

  • DB_PASSWORD

  • DB_HOST

このへんをCFnで定義している。ユーザー名、データベース名やパスワードには変更が無いので、データベースのホスト名を変更する。

-変更前、+変更後

- DBEndpoint: !GetAtt DB.Endpoint.Address
+ DBEndpoint: !GetAtt DBCluster.Endpoint.Address
- Name: DB_HOST
- Value: !GetAtt DB.Endpoint.Address
+ Value: !GetAtt DBCluster.Endpoint.Address

こんな感じに変更して、CFnテンプレートを更新するとOK。

STAFF
o_wani
o_wani
スタッフ
大学卒業後、15年間WEB業界で働く。現在はマネジメントに従事していますが、ChatGPTの登場に触発され、このブログを再開。AIをパートナーに、自分で手を動かして実装する楽しさと喜びを再発見中。時代が変わりつつある中でも、陳腐化しない情報発信も目指しています。
記事URLをコピーしました