背景
RDS(AWS)やCloud SQL(GCP)を利用する際に、どのようにデータベースやテーブルを作成するかを纏めてみる
初期化方法
(1)DBインスタンスにログインして初期化する
ローカルのDBの初期化をSQLで行う場合はこちらを利用することを考える
- アプリでORMを使わない場合
- docker-entrypoint-initdb.dを使う場合
RDS(AWS)
以下の条件を満たすように設定すれば任意のmysqlクライアントからインターネット経由でアクセス可能になる(ただし初期化後は安全のためアクセスを塞いでおくべきである)
- RDSがパブリックサブネットに配置されていること
- VPCのセキュリティグループにmysqlのインバウンドルールが追加されていること
- パブリックアクセシビリティが許可されていること
あるいは同じVPC内に踏み台サーバを起動し、踏み台サーバ経由でアクセスする方法もある。
- サーバレスAuroraではインターネットアクセスができないため、この方法か、次節の方法で初期化する。
- 踏み台サーバは必要な時だけ起動したり、IP制限するとセキュアである
Cloud SQL(GCP)
Cloud Shellからアクセスして初期化する
(2)DB初期化アプリケーションを作成して初期化する
アプリケーションで利用しているライブラリとシステムを用いたDB初期化用のアプリケーションを作成・実行する。
例: SQLAlchemyを利用したCloud Runで動くアプリであれば、SQLAlchemyを利用したDB初期化アプリを作成し、Cloud Runで実行する
大抵のORMにはテーブルを作成する機能があるので利用する。
(3)[Kubernetesの場合]Kubernetesの機能を利用する
アプリケーションがKubernetesで動作している場合は、Kubenetesの機能を用いてデータベースの初期化をすることもできる。
Init Containerを利用
ネットワーク・ボリュームが初期化された後、アプリケーションコンテナが起動する前に実行されるコンテナ。
起動コマンドとしてSQLコマンドを実行させたり、ライブラリを利用したアプリケーションを実行させたりできる。
ConfigMapで記述(できないかも)
ConfigMapにSQLをベタ書きして docker-entrypoint-initdb.d にマウントする方法
Cloud SQLを利用していて、cloudsql-proxyを利用している場合に利用できるかは未確認。
参考記事:
[Kubernetes] ConfigMapでコンテナの設定ファイルをVolumeに配置する
https://a-records.info/kubernetes-configmap-for-container-settings/
まとめ
- 簡単にやるならDBインスタンスにログインして初期化する
- 丁寧にやるならアプリやインフラなどからよしなに初期化方法を採用する
- Kubernetesを利用しているならInitContainerを利用する