⚒️

ECS上に展開したMariaDBサーバのDeployがうまくいかない時のTips

2022/05/13に公開

そもそも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.sql2_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