EC2を使ったPostgreSQLダンプファイルのリストア手順

こんにちは。デザイン・システム室の永野です。

今回は、EC2を使ったPostgreSQLダンプファイルのリストア手順についてまとめてみました。

今後、EC2を用いてPostgreSQLダンプファイルをリストアし、そのデータをRDS上に保存できるようにしたいという方のためになれば幸いです。

イメージ図と行ったこと

PostgreSQLダンプファイルをEC2上でリストアし、RDSにデータを保存するイメージは下記の通りです。

また、リストアの実行手順は下記の通りです。

① EC2インスタンス、SGの作成

② EC2インスタンスにSSH接続するためのSSHキーの作成

③ RDS DBインスタンス、SGの作成

④ scpコマンドで、ローカルPCからEC2インスタンスへコピー

⑤ EC2インスタンスにpsqlクライアントをインストール

⑥ EC2インスタンス内で、リストアコマンドを実行

⑦ データベースに接続し、リストアされたかどうかの確認

①〜③は、AWSコンソール上で設定してください。個人的なポイントとしては、EC2がRDSにアクセスできるようにするために、RDSのセキュリティグループのインバウンド許可設定にEC2のセキュリティグループを追加することです。ただ、今回は説明を省略させていただきます。

今回は、④ 以降の実行手順について説明いたします。

④ は、EC2インスタンスの外で実行します。実行コマンドは下記の通りです。

$ scp -i /path/to/your-key.pem /local/path/to/file.txt ec2-user@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com:/home/ec2-user/

コマンドの説明は下記の通りです。

  • i /path/to/your-key.pem → EC2インスタンスにアクセスするためのキーペア(秘密鍵)のパス
  • /local/path/to/file.txt → ローカルPCの転送したいファイルのパス
  • ec2-user@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com → EC2インスタンスのユーザー名とパブリックDNS(Amazon Linuxの場合、ユーザーは ec2-user
  • :/home/ec2-user/ → EC2インスタンス側の保存先ディレクトリ

上記コマンドを実行することで、EC2インスタンス内に、dumpファイルが転送されます。

次に、⑤ 以降のコマンドは、EC2インスタンス内で実行する必要があります。

なので、下記のコマンドを実行し、ローカルPCからEC2へSSH接続し、EC2インスタンス内に入ります。

実行コマンドは下記の通りです。

$ ssh -i "dump-restore-key.pem" ec2-user@ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com
   ,     #_
   ~\\_  ####_        Amazon Linux 2023
  ~~  \\_#####\\
  ~~     \\###|
  ~~       \\#/ ___   <https://aws.amazon.com/linux/amazon-linux-2023>
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-xx-x-x-xxx ~]$

上記画面が出力されたら、EC2インスタンス内に入ることができたということになります。

次に、⑤ ですが、今回のケースでは、アプリケーションが接続していたデータベースとして PostgreSQL を使用していました。

また、EC2インスタンスは、起動直後から psql がインストールされているわけではありません。

この処理を行うには、PostgreSQL データベースを操作するためのツールである psql クライアント が必要となります。なので、この後は、psqlクライアントをインストールしたいと思います。

コマンドでEC2インスタンス内に、psqlクライアントがインストールされているか確認するためのコマンドは、下記の通りです。

[ec2-user@ip-xx-x-x-xxx ~]$ which psql
/usr/bin/which: no psql in (/home/ec2-user/.local/bin:/home/ec2-user/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)

上記より、psqlがインストールされていないことが確認できたので、この後は psql をインストールします。psql のインストールコマンドは下記の通りです。

[ec2-user@ip-xx-x-x-xxx ~]$ sudo dnf install postgresql15

インストールを終えた後、which psql コマンドで、パス表示されていれば、インストールされていると思います。

私の場合、which psql コマンドで確認したところ、/usr/bin/psql と表示されました。

[ec2-user@ip-xx-x-x-xxx ~]$ which psql
/usr/bin/psql

また、この後 ⑥ で、リストアコマンドを実行しますが、念の為、この時点でEC2インスタンスからRDSへ接続できることを確認してください。

実行コマンドは下記の通りです。

[ec2-user@ip-xx-xx-xx-xxx ~]$ psql --host=database-1.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port=5432 --dbname=postgres --username=postgres
Password for user postgres: 
psql (15.13, server 17.4)
WARNING: psql major version 15, server major version 17.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

次に、上記状態から exit コマンドで抜け、再びEC2インスタンス内に戻ります。

そして、⑥ ですが、下記のコマンドがリストアコマンドになります。

実行コマンドは下記の通りです。

[ec2-user@ip-xx-xx-xx-xxx ~]$ psql --host=database-1.xxxxxxxx.ap-northeast-1.rds.amazonaws.com \\
     --port=5432 \\
     --username=postgres \\
     --dbname=postgres \\
     -f ~/xxxxxx.dump

上記を実行することで、リストアを実行することができます。

最後の ⑦ として、EC2からRDSへ接続し、テーブルやデータが作成されているか確認してみます。

[ec2-user@ip-xx-x-x-xxx ~]$ psql --host=database-1.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --username=postgres --dbname=postgres
psql (15.13, server 17.4)
WARNING: psql major version 15, server major version 17.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=> \\dt
                          List of relations
 Schema |                   Name                   | Type  |  Owner   
--------+------------------------------------------+-------+----------
 public | active_storage_attachments               | table | postgres
 public | active_storage_blobs                     | table | postgres
 public | analyst_reports                          | table | postgres
 public | api_keys                                 | table | postgres
 public | ar_internal_metadata                     | table | postgres
 public | attendance_details                       | table | postgres
 

・
・
・

postgres=> SELECT * FROM active_storage_attachments LIMIT 5;
 id |    name    |       record_type        | record_id | blob_id |         created_at         
----+------------+--------------------------+-----------+---------+----------------------------
  xx | image      | Xxxxxxxxxxxxxxxxxxxxxxx  |       xx  |     xx  | 2024-12-05 xx:xx:xx.xxxxxx
  xx | main_image | Xxxxxxxxxxxxxxxxxxxxxxx  |       xx  |     xx  | 2025-06-03 xx:xx:xx.xxxxxx
(2 rows)

上記より、無事、EC2内で dumpファイルをリストアし、RDSに保存することができました。

まとめ

今回、EC2を使ったPostgreSQLダンプファイルのリストア手順を紹介いたしました。

私が思っていたよりも簡単に実行することができました。

今回の経験をもとに、他のデータベースでも、今回のような手順で、dumpファイルをリストアすることができるかどうか、試してみたいと思います。

現在デザイン・システム室では、新しいメンバーを募集しています。
少しでも興味を持たれた方は、ぜひご応募ください。
皆様からのご応募、心よりお待ちしております。