「Amazon RDS を外部マスタとして使用する(AWS コンソール)」「Amazon RDS を外部マスタとして使用する(Terraform)」で文字化けやエラーが起きた場合のトラブルシューティングをご紹介します。

目次

データベースに接続できない

次の mysql コマンド

mysql -h {エンドポイント} -P {ポート番号} -u {マスターユーザー名} -p

でデータベースへの接続ができないときは、データベースインスタンスの設定(パブリックアクセスの許可、VPC セキュリティグループの設定)を確認します。

パブリックアクセスの許可

まずはパブリックアクセスの許可を確認しましょう。データベースインスタンスを選択し、「接続とセキュリティ」タブの「パブリックアクセシビリティ」を確認します。

パブリックアクセシビリティが「あり」であれば設定不要ですので、次の「VPC セキュリティグループの設定」に進んでください。「なし」であれば右上の「変更」をクリックします。

設定を変更できる項目の中から「ネットワーク & セキュリティ」のブロックを探し、パブリックアクセシビリティを「はい」にして「次へ」をクリックします。

変更のスケジュールは「すぐに適用」を選択し、「DB インスタンスの変更」をクリックします。

VPC セキュリティグループの設定

パブリックアクセシビリティが「はい」になっていてもデータベースに接続できない場合は、VPC セキュリティグループの設定を確認します。

データベースインスタンスを選択し、「接続とセキュリティ」タブに表示される VPC セキュリティグループをクリックします。

「インバウンドルール」タブの「インバウンドルールを編集」をクリックします。

「ルールを追加」をクリックし、「全てのトラフィック」「マイ IP」を選択し、「ルールを保存」をクリックします。

以上の設定で mysql コマンドを使ってデータベースに接続できるようになります。下のコマンドを再度実行してみましょう。(コマンドの後、マスターパスワードを入力します)

mysql -h {エンドポイント} -P {ポート番号} -u {マスターユーザー名} -p

日本語が文字化けする

日本語が文字化けしないようにデータベースの文字コードを UTF-8 に統一します。

Amazon RDS の左メニューで「パラメータグループ」を選択し、「パラメータグループの作成」をクリックします。

「タイプ」は「DB Cluster Parameter Group」を選択します。グループ名(ここでは paramgroup-for-utf8 としています)と説明を入力し、「作成」をクリックします。

作成したパラメータグループの「パラメータの編集」をクリックし、以下の5つのパラメータを utf8 に、skip-character-set-client-handshake を 1 に設定し、「変更の保存」をクリックします。

  • character_set_client
  • character_set_connection
  • character_set_database
  • character_set_results
  • character_set_server

データベースクラスタを選択し、「変更」をクリックします。

「データベースの設定」ブロックの「DB クラスターのパラメータグループ」に作成したパラメータグループを選択し、「次へ」をクリックします。

「すぐに適用」を選択して「クラスターの変更」をクリックします。

パラメータグループの変更を適用するため、データベースインスタンスを再起動します。データベースインスタンスを選択し、右上の「アクション」から再起動をクリックします。

しばらく待ち、データベースインスタンスの再起動が完了したら、文字コードの設定を確認してみましょう。データベースに接続し、mysql> に続けて次の MySQL コマンドを入力、実行します。

show variables like 'char%';

次のように、 character_set_client、character_set_connection、character_set_database、character_set_results、character_set_server が utf8 になっていれば大丈夫です。

+--------------------------+--------------------------------------------------+
| Variable_name            | Value                                            |
+--------------------------+--------------------------------------------------+
| character_set_client     | utf8                                             |
| character_set_connection | utf8                                             |
| character_set_database   | utf8                                             |
| character_set_filesystem | binary                                           |
| character_set_results    | utf8                                             |
| character_set_server     | utf8                                             |
| character_set_system     | utf8                                             |
| character_sets_dir       | /rdsdbbin/oscar-5.6.10a.200340.0/share/charsets/ |
+--------------------------+--------------------------------------------------+

Lambda 関数の実行が上手くいかない

Lambda 関数の実行ログは AWS の CloudWatch というサービスで確認できます。左メニューの「ロググループ」から作成した Lambda 関数を選択し、ログを表示します。

タイムアウトエラーになっているときは、Lambda 関数のタイムアウトが短すぎるのかもしれません。Lambda 関数のタイムアウトは「基本設定」ブロックの「編集」ボタンから変更できます。

Terraform 実行時のエラー(InsufficientStorageClusterCapacity)

terraform apply を実行すると、次のようなエラーが出ることがあります。

Error: error creating RDS cluster: InsufficientStorageClusterCapacity: Couldn't create cluster: insufficient capacity in requested AZs

指定したリージョンの AZ (Availability Zone) の空き容量が不足していると生じるエラーです。アカウントの設定によらず、AWS のリソース状況次第でこのエラーが起こり得ます。このエラーを回避するには、以下の方法があります。

  • しばらく時間を置いてから再度実行する(容量不足が解消されることがあります)
  • 別の AZ を指定する(network.tf ファイルを書き換えます)
  • 別のリージョンを指定する(.tfvars ファイルを書き換えます)

別の AZ を指定するには、まず以下のコマンドで利用できる AZ を確認します。

aws ec2 describe-availability-zones --region {リージョン名(例:ap-northeast-1)}

AZ が2つしか表示されない場合は、別の AZ を指定することができません(元々の Terraform コードで両方の AZ をすでに指定しているため)。AZ が3つ以上表示された場合、次の手順で3つ目以降の AZ を指定することでエラーが解消されることがあります。

network.tf の33行目、40行目で AZ 名を指定しています。片方、もしくは両方の AZ 名のインデックスを2以上の異なる数に書き換えます。例えば次のように片方のインデックスを2にします。

availability_zone       = data.aws_availability_zones.available.names[2]

network.tf を上書き保存後、あらためて terraform apply を実行してみてください。

%d人のブロガーが「いいね」をつけました。