zenet_logo

-株式会社ゼネット技術ブログ-

【AWS】MySQLからRDSにデータベースを移行した後に起こったシステムエラーの解決プロセス

f:id:zenet-tech:20211004180644p:plain



 

初めまして、ゼネットの齊藤です。

 新人として現在AWSハンズオン研修を受けており、

 『Amazon Web Service クラウドデザインパターン 実装ガイド』

 に沿ってAWSでシステムを構築するといった内容を行っています。

 教本通りにEC-CUBEを構築しMySQLからRDSにデータベースを

 移行しましたがシステムエラーが表示されてしまい

 詰まってしまっていました。(実装ガイド 4-4の内容)

 もし同じ状況の方がいたら、参考になればと思い記事を投稿しました。

 

 目次

 

 

概要

EC-CUBEを使用しEコマースサイトを作成しようとしています。

作成手順としては、以下のように行いました。

  1. EC2インスタンスを作成する。
  2. Rlogin(SSH接続ターミナルソフト)からEC2インスタンスにMySQLとEC-CUBEをインストール。
  3. MySQLを使ってEC-CUBEの構築を行う。
  4. MySQLでファイルをダンプする。
  5. ダンプファイルをRDSにインポートする。
  6. EC-CUBEのサイトにアクセスする。

 

経緯

 サイトにアクセスするとEC-CUBEのサイト上にシステムエラーが

 表示されてしまいました。

 

f:id:a-saito_pn:20210906141538p:plain

 

 このシステムエラーの解決にかなり時間がかかってしまいました。

 

 

環境

  • MySQL Version 8.0.26
  • RDS Version 8.0.25
  • PHP Version 5.4.16
  • EC-CUBE Version 2.17.1

 

解決方法

 

 原因の調査を行ったところ、PHP Version 5.4.16 の文字コードがutf8mb4に

対応しておらずDBの文字コードと不整合が発生していることが原因でした。

そのため、

  ・PHPをアップデートする

  ・文字コードをutf8mb3に設定する

 このいずれかで解決できそうです。

 

 今回はEC-CUBEの2系を使用しているため、PHPをバージョンアップする場合、ECCUBEのバージョンも上げる必要があるためDBの文字コードをutf8mb3に設定することで対応します。

 

 PHPをアップデートし、EC-CUBEを4系で再度構築する場合は

 こちらの記事を参照してください。

media.zenet-web.co.jp

 

 

文字コード変更

 

 EC-CUBEの2系を使用する場合は、

 RDSに作成されていたデータベースを削除し、utf8mb3を指定して

 データベースを作成します。

 

 RDSの文字コードは、コンソール上から変更します。

 

 以下に手順を示します。

 

 DB パラメータグループの作成

 1. AWS Management Console にサインインし、Amazon RDS コンソール  (https://console.aws.amazon.com/rds/) を開きます。

 

 2. ナビゲーションペインで、[パラメータグループ] を選択します。

  [パラメータグループを作成] を選択します。

f:id:a-saito_pn:20210908104519p:plain

 

 3. [パラメータグループの作成] ウィンドウが表示されます。

 

 4. [パラメータグループファミリー]  [グループ名] [説明] を入力します。

f:id:a-saito_pn:20210908104749p:plain

 

 5. [作成] を選択します。

f:id:a-saito_pn:20210908105034p:plain

 

 パラメータグループの作成が完了しました。

 

 パラメータグループの変更

 1. 作成したパラーメータグループを選択し、[変更]を選択します。

f:id:a-saito_pn:20210908105425p:plain

 

 2. 以下のように変更します。

 character_set_server :utf8
 character_set_connection:utf8
 character_set_database:utf8
 collation_connection:utf8_general_ci
 collation_server:utf8_general_ci
 

f:id:a-saito_pn:20210907110149p:plain


 3. 変更を選択し完了

f:id:a-saito_pn:20210907111207p:plain

 

 パラメータグループの適応

 1. コンソールからRDSにアクセスし、自分の作成したデータベースを選択。

 

 2. [変更]を選択。

f:id:a-saito_pn:20210908110014p:plain

 

 

 3. 追加設定の中のDBパラメータグループで作成した

  パラメータグループを選択。

f:id:a-saito_pn:20210908110444p:plain

 


 4. RDSを再起動する。

 

 パラメータグループで文字コード変更が完了しました。

 Rloginで正しく設定できているか確認します。

f:id:a-saito_pn:20210907114433p:plain

f:id:a-saito_pn:20210907114541p:plain


 設定が適応されています!

 

 サイトにアクセスしてみます、、

 

f:id:a-saito_pn:20210907115145p:plain

 

 表示されました!

 

原因調査の記録

 

 エラーの解決に慣れていなかったため、

 思いついたことを手当たり次第に試し、原因を調査しました。

 記載は行った順となっております。

 同じシステムエラーが起きている方は、

 疎通確認とエラーログの確認を行うので十分だと思います。

 

1. 同一ネットワーク上にあるか

 EC2とRDSが同じVPC上にあるかコンソールから確認します。

 

f:id:a-saito_pn:20210909134511p:plain

   EC2インスタンスの確認

 

 

f:id:a-saito_pn:20210909134936p:plain

   RDSの確認


 コンソールから確認したところ、いずれも vpc-d7f7edb2 にあり同一VPC上に

 ありました。


2. ファイアウォールに設定した値を確認する

 通信が拒否されていないかを確認するため、

 セキュリティグループを確認します。 

 教本通りに設定を行ったので、RDSにはdefaultのセキュリティグループ

 を使用していました。調べたサイトに

 「EC2と同じセキュリティグループを適応する」

 とあったので、EC2と同じものを適応してみましたが、

 システムエラーは直りませんでした。

 そもそも通信できているのでしょうか。


3. 疎通確認

 Rroginから pingコマンドで確認しようとしていましたが、応答がありません。

 

f:id:a-saito_pn:20210909135207p:plain



 調べたところ、RDSにpingは使用できないそうです。

 ncコマンドを使用し確認します。

 ※ncはインストールしないと使えません。

 使用したコマンドは以下です。

  

  $ sudo yum install nc

  $ nc -zv エンドポイント ポート番号

  

 以下のように表示されたため、接続が確認できました。

 (これを最初に行っていたら、セキュリティグループを弄ったりする時間は

 必要なかったです、、)

f:id:a-saito_pn:20210908091809p:plain



 

4. インポートはできているのか

 ずっとインポートができていないと思っていましたが、

 疎通確認も完了し、もしかしたらできているのかもしれません。

 確認していなかったので、RDSのデータ確認を行います。

 RloginからRDSにログインし、以下のコマンドを実行しました。

 

  show tables from データベース名;

 

f:id:a-saito_pn:20210908100227p:plain

           RDSのファイル

 

f:id:a-saito_pn:20210908101309p:plain

       ダンプをとった元のファイル

 

 ダンプファイルが入っています。

 MySQLと同じファイルが確認できました。

 インポートは正常に完了していることが分かります。

 最初にこれを見るべきでした、、

 (VPCやセキュリティグループの確認に時間をかなり

 使ってしまっていました、、)


5. エラーログの確認

 接続とインポートには問題がないということで、

 エラーログを確認します。

 エラーログの確認には以下のコマンドを実行しました。

 (/var/www/dataはデータを構成するディレクトリです。)

 

  $ cd /var/www/data/logs

  $ cat error.log

 

f:id:a-saito_pn:20210908110729p:plain

 

 doConnect: [Error message: Server sent charset unknown to the client. Please, report to  the developers]

 とあるので、文字が読み取れていないようです。

 インポートされたRDSがファイルを読み込む際に文字コードが違うために

 読み取れないと推測できます。

 エラーログももっと早く確認していれば、すぐに原因を突き止められたかも

 しれません。

 

5. 文字コードの確認

 RDSの文字コードを確認します。

 RloginからRDSにログインし、以下のコマンドを使用し確認しました。

 

  show variables like '%char%';
  show variables like '%connect%';
  show variables like 'coll%';

 

 show variables like '%char%';

f:id:a-saito_pn:20210908102740p:plain

 

 show variables like '%connect%';

f:id:a-saito_pn:20210908102905p:plain

 

 show variables like 'coll%';

f:id:a-saito_pn:20210908103057p:plain

 

 それぞれ上記のように表示されました。

  

 EC-CUBEではPHPで書かれているプログラムであるため、

 PHPのバージョンを確認します。

 バージョンは

  $ php -v

 で確認できます。

 PHPの最新版は8.0.9となっており、現在使っているPHP(5.4.16)は2015年頃の

 ものなので古いバージョンとなっています。

 

 現在ではutf8mb4を使っているためRDSはかつてのutf8mb3ではなく

 utf8mb4で設定されているようです。

 (MySQLは最新の8.0.26をダウンロードしたため)

 これでは読み取れないため、

  ・PHPをアップデートする

  ・文字コードをutf8mb3に設定する

 このいずれかで解決できそうです。

 

 

まとめ

 エラーが出た時には推測で闇雲に検索したものを試していましたが、

 疎通確認やエラーログの確認等、何ができていて何に失敗しているのか、

 原因をまず追究することがエラー解決の近道だと分かりました。

 今後はエラー対処の際は、まず初めに現状確認を行うようにしようと思います。

 

 今回の場合は、

 1. 疎通確認

 2. エラーログの確認

 の手順で行えばもっと早く解決できました、、!

 

 また、教本沿って進めていたところ、

 MySQLにインストールが終わった後に、 

 使っていたMySQLのバージョンがRDSに対応しておらず、

 最新のMySQLをインストールしなければならなくなりました。

 インストールしたMySQL、RDS、PHPの

 バージョンを事前に確認することで、

 エラーは出ずに済んだかもしれません。

 (新しい教本を使うのも大事かもしれないです、、) 

 

 皆様もバージョンにはお気を付けください。

 

 最後までお読みいただきありがとうございました!

 

 

参考文献一覧

 

qiita.com

tech-it.r-net.info

uxmilk.jp

docs.aws.amazon.com