
「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 を実行してみてください。
ピンバック: Terraformの雰囲気を学ぶ(1) - とのやまのブログ