ECSから rails db:migrate:reset するときに発生するエラー(〇〇 is being accessed by other users)を解消する


注意

ポートフォリオ用に作成したサイトの本番環境を直接操作しています。
適切な対処法でないかもしれないので、とりあえずエラーを直したいという方はどうぞ。

背景

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コンテナを壊して再構築していました。そのため、本番環境の対処がわからず戸惑いました。何も考えずに作業すると良くないですね勉強します。