[AWS] CloudFormationで管理しているRDS for MySQLからAurora MySQLに移行する手順
AWSのCloudFormationで管理しているRDS for MySQLのリソースがあり、それをAurora MySQLに移行する手順を記載しておく。また、それに伴い、今回はRubyのアプリの更新(データベースの接続先の切替)までを行います。
参考サイト
いつもお世話になっているクラスメソッドの記事:
AWS CloudFormationで管理しているAmazon RDS for MySQLからAmazon Aurora MySQLに移行する手順を整理した
流れとしては、
DB Cluster Parameterグループを作成する
RDS for MySQLのAuroraのリードレプリカを作成する
Auroraのリソースをインポートする
リードレプリカを昇格する
CloudFormationの更新を行う
アプリのデータベース接続を更新する
といった内容となる。
以下、CloudFormation=CFnと略する。
DB Cluster Parameterグループを作成する
文字コード関連を「utf8mb4」、タイムゾーンを「Asia/Tokyo」に設定するためのauroraのパラメータグループの作成を行う。
タイプ:DB Cluster Parameter Group
グループ名:aurora-cluster-param(自分で決める)
タイムゾーンをAsia/Tokyo
タイムゾーンをAsia/Tokyo
に変更する。
文字コード関連をutf8mb4
文字コード関連6つを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リードレプリカの作成]を行う。各設定は要件に合わせて選択する。
そうすると既存のRDSのリードレプリカとしてAuroraが作成され、自動的にデータが同期されるようになる。便利すぎる。さっそくAuroraリードレプリカを作成する。
インスタンスを選択する:
ネットワーク&セキュリティは環境に合わせる:
データベースの設定する:
DBクラスターのパラメータグループは、最初作成したものを設定する。
暗号化は有効にする:
今回暗号の有効化はしておく。
バックアップ:
1日の保存期間としているが、要件に応じて7日などに変更するとOK。
今回は以上の内容で作成した。
データベースの一覧に戻ると「作成中」となった。
約10分後「Preparing-data-migration」、約20分後「移行中」となり
約23分後クラスターが「利用可能」となった。
約35分後すべて「利用可能」になった。
同期するデータの量にもよると思うけど、リードレプリカの作成完了までは少なくとも30分は見込んでおいた方が良さそう。
CFnスタックにインポートする
[CloudFormation]>[スタック]>[スタックアクション:スタックへのリソースのインポート]で作成したリードレプリカを現状のCFnで認識できるようにインポートする。
現状の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ファイルアップロード
[ファイルの選択]から選んでアップロードし、[次へ]
インポートするリソース識別
Aurora MySQLのリソース3つを入力する。
識別子を入力する:
DBCluster:aurora-cluster
DBReaderInstance:aurora-ap-northeast-1c
DBWriterInstance:aurora
スタックの詳細を指定
特に何も変更なしで。
特に何も変更なしで。
概要をインポート
特に何も変更なしで。
下のほうに今回のインポート対象が出てくる。
3つ出てくることを確認して[リソースをインポート]を選択する。
インポートを確認
リソースに3つインポートされたことを確認した。
「DBCluster」「DBReaderInstance」「DBWriterInstance」
Auroraリードレプリカの昇格
Auroraを昇格させる。
※昇格させた時点で、RDSとの同期が解除されることに注意
また、昇格させると同期元であるRDSは「プライマリ」から「インスタンス」に変更される。同期されている場合「プライマリ」のまま。
Auroraクラスターを選択し、[アクション] > [昇格]を選択する。
[リードレプリカの昇格]を選択する。
3分ほどで昇格完了。同期元であるRDS(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。