注意
ポートフォリオ用に作成したサイトの本番環境を直接操作しています。
適切な対処法でないかもしれないので、とりあえずエラーを直したいという方はどうぞ。
背景
railsコンテナで rails db:migrate:reset
ができない
あるときseedファイルを変更したので、一度RDSの中をリセットしようと思いrailsコンテナから上記のコマンドを打つと、タイトルのエラーが発生しました。他のユーザー(というかコンテナ)が接続しており、実行できないとのことです。
使用技術
・ECS:EC2タイプ
・RDS:PostgresQL(11.11)
上記のインスタンスの作成は割愛します。
やったこと
EC2にpsqlコマンドをインストールしてRDSに接続
railsコンテナからRDSにアクセスしようとしたのですが、肝心のpsqlコマンドをインストールしていませんでした。
そこで応急処置として、EC2にpsqlコマンドを入れて接続しました。
以下、その手順です。
(現在、amazon-linux-extrasはpostgresql11までしかインストールできません。12,13をインストールする場合はこちらの記事が参考になります。)
# ご使用のバージョンに合わせてインストールしてください
$ sudo amazon-linux-extras postgresql11
# バージョンの確認
$ psql --version
psql (PostgreSQL) 11.5
# DBアクセス用のuserがいない場合は作成してください
$ sudo adduser <ユーザー名>
$ su - <ユーザー名>
# postgresサーバーに接続
$ psql \
> --host=<RDSのエンドポイント> \
> --username=<ユーザー名>
> --password \
> --port=5432 \
> --dbname=<RDSのインスタンス名>
これで接続は完了です。
(接続できないときは、RDSのセキュリティグループのインバウンドを確認してみてください)
RDSにアクセスしているプロセスを削除
接続できれば、あとは接続中のプロセスをみつけて削除するだけです。
# すべてのプロセスを表示
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();
# 表示例
1234
1235
# プロセスを削除
SELECT pg_terminate_backend(1234);
SELECT pg_terminate_backend(1235);
# psqlの終了
\q
# コンテナに入ったのち、下記のコマンドを実行
$ bundle exec rake db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
以上になります。
まとめ
私は開発環境でPostgresQLをコンテナ化していたので、エラーが出た時はDBコンテナを壊して再構築していました。そのため、本番環境の対処がわからず戸惑いました。何も考えずに作業すると良くないですね勉強します。