ECS上に展開したMariaDBサーバのDeployがうまくいかない時のTips
そもそもECSでDBコンテナを展開することは少ないかもしれません。
一般的なDBの要件としてデータが半永久的に保持されることが当たり前なはずですが、ECS上に展開したDBはサービス定義の更新のたびにDBが新しく(初期化)されてしまい、データの永続性が実現できないためです。
しかし、サービス上で生成されたデータを慣れ親しんだSQLで簡単に操作したい & データは永続性が保証されなくても良い場合には、ECSにDBを展開するのも選択肢となります。
上の様な状況において、ECSデプロイの際に苦しんだ点を共有したいと思います。
ECS上に展開したMariaDBへの初期投入SQLファイルの最大サイズは2MB(?)
DockerのMariaDB公式イメージから展開したDBに初期データを投入したい場合、/docker-entrypoint-initdb.d/
に.sh, .sql, .sql.gz
ファイルを配置してあげることで、コンテナの立ち上げ時に自動で初期データが取り込まれます。
そのためDockerfileを用いる場合であれば
ADD hogehoge.sql /docker-entrypoint-initdb.d/
docker-composeの場合は./mysql/init
にsqlやshファイルを配置した上で
mariadb:
image: mariadb:latest
volumes:
- "./mysql/init:/docker-entrypoint-initdb.d"
と記述することで、自動で初期データを投入してくれます。
私の場合はDokcerfileを用いて初期データを配置したのですが、なぜか.sqlファイルサイズが2MBを超えてから、デプロイ時にSQLの構文エラーが出る様になってしまいました。
調べてもSQL自体に問題はなく、ローカル環境では問題なくimportできていました。
そこで.sqlファイルを二つに分割しそれぞれが2MB以下になる様にしたところ、SQLの構文エラーは発生しなくなりました。
複数の.sh, .sql, .sql.gz
ファイルが配置されている場合、アルファベット順にそれらが投入されていくので、ファイル名をそれぞれ1_hogehoge.sql
と2_piyopiyo.sql
という具合に決めてあげれば、投入順に関してもこちらの意図した通りに実行されます。
ECS上に展開したMariaDBへの初期投入SQLファイルが複数ある場合、並列で投入が行われる(?)
上の様に複数.sqlファイルを準備していざデプロイしてみたところ、今度はNo database selected
と怒られる様になってしまいました。
アルファベット順もしっかり守って1_hogehoge.sql
の後に2_piyopiyo.sql
が投入される様にしたのですが、うまくいきません。
ログを確認したところ、1ファイルの投入が終わってから2に取り掛かるのではなく、複数ファイル並列で走っている気配がしたため、それぞれの.sqlで共通のDBやTABLEを扱う場合は必ずはじめにCREATE DATABASE IF NOT EXISTS
やをCREATE TABLE IF NOT EXISTS
の構文を走らせる様にしました。
例えば、どちらの.sqlファイルでもtest_db
というDBにデータを投入し、さらにどちらもtest_table
というテーブルを扱う場合は、以下の様な記述が両ファイルに必要になります
CREATE DATABASE IF NOT EXISTS test_db default character set utf8mb4;
use test_db;
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_table` (
`id` bigint(20) UNSIGNED NOT NULL,
`text` varchar(500) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
こうすることによってようやく初期データの投入とシステムのデプロイに成功しました。
さいごに
以上が、私がECS上にMariaDBサーバを展開しようとしたが時に出くわしたデプロイエラーへの対処法になります。
その場その場の対処法であり、本当に初期投入ファイルに2MB制限があるのか、初期投入SQLファイルが複数ある場合並列で投入が行われるかは、正直よくわかっていません。
(ドキュメントをよく読んだり、日英で検索したりしましたが、これらの説明は見つけることができませんでした)
もしECS上で同じ様なエラーに出くわした方がいたときに、そのエラー解消のお手伝いとなれば幸いです。
Discussion