HerokuからAWSへのPostgreSQL移行手順

本記事では、こHerokuで運用していたPostgreSQLデータベースをAWS環境へ移行する手順を、AWS EC2の構築からPostgreSQLのインストール・設定、データ移行まで全工程にわたって解説します。また、AWS上でのPostgreSQL運用における選択肢（Amazon RDS vs EC2への直接インストール）の比較について、私の[関連記事](https://qiita.com/TANIOKA_Akihiro/items/e62fa269086a03ad5b9d)も参考情報としてご紹介します。

---

## 0. AWS上でのPostgreSQL運用の選択肢について

AWS上でPostgreSQLを運用する際、主に以下の2つの方法が考えられます。

- **Amazon RDS**  
  自動バックアップや障害復旧など運用管理が容易になる反面、無料期間終了後は月額費用が発生します。

- **EC2に直接PostgreSQLをインストール**  
  初期費用やランニングコストを抑えたい場合、特に個人開発環境では有利です。ただし、バックアップなどの運用管理は手動対応となります。

私の記事「[AWS上でのRails+PostgreSQL運用：RDS vs EC2直接インストールの選択](https://qiita.com/TANIOKA_Akihiro/items/e62fa269086a03ad5b9d)」では、この両者のメリット・デメリットを詳しく解説しています。今回の移行手順は、コスト面や自由度の高さからEC2に直接PostgreSQLをインストールする方法を採用しています。

---

## 1. AWS環境の準備

### 1.1 EC2インスタンスの作成

- **OS:** Amazon Linux 2023を選択  
- **インスタンス種別:** t2.micro（無料利用枠対象）  
- **キーペア:** インスタンス作成時にキーペア（.pemファイル）をダウンロード

### 1.2 Elastic IPの設定

1. **Elastic IPの割り当て**  
   AWSマネジメントコンソールのEC2ダッシュボードから「Elastic IP」を選択し、「Elastic IPアドレスの割り当て」をクリック。デフォルト設定でIPを割り当てます。

2. **Elastic IPのインスタンスへの関連付け**  
   割り当てたElastic IPを選び、「アクション」から「Elastic IPアドレスの関連付け」を選択し、作成したEC2インスタンスに関連付けます。

### 1.3 セキュリティグループの設定

EC2インスタンスに適用するセキュリティグループで、以下のインバウンドルールを設定します。

- **SSH（ポート22）**  
  - ソース: 自分のIP（My IP）

- **PostgreSQL（ポート5432）**  
  - ソース: 自分のIP（My IP）

---

## 2. EC2への接続

ダウンロードしたキーペア（.pemファイル）のパーミッションを設定し、SSHでEC2に接続します。

```bash
# .pemファイルのパーミッション変更
chmod 400 ~/.ssh/your-key.pem

# SSH接続
ssh -i ~/.ssh/your-key.pem ec2-user@your-elastic-ip
```

---

## 3. PostgreSQLのインストールと設定

### 3.1 インストールと初期化

EC2上でPostgreSQLをインストールし、データベースの初期化を行います。

```bash
# PostgreSQLのインストール
sudo dnf install postgresql15 postgresql15-server -y

# データベースの初期化
sudo postgresql-setup --initdb

# PostgreSQLの起動と自動起動設定
sudo systemctl start postgresql
sudo systemctl enable postgresql
```

### 3.2 設定ファイルの変更

#### postgresql.confの編集

リモートからの接続を許可するため、`postgresql.conf`を編集します。

```bash
sudo vi /var/lib/pgsql/data/postgresql.conf
```

編集例:
```conf
listen_addresses = '*'
log_directory = 'log'
```

#### pg_hba.confの編集

リモート接続を許可するため、`pg_hba.conf`の末尾に以下の行を追加します。

```bash
sudo vi /var/lib/pgsql/data/pg_hba.conf
```

追加内容:
```conf
host    all    all    0.0.0.0/0    scram-sha-256
```

### 3.3 ログディレクトリの設定

ログファイル用のディレクトリを作成し、適切な所有権・パーミッションを設定します。

```bash
sudo mkdir -p /var/lib/pgsql/data/log
sudo chown postgres:postgres /var/lib/pgsql/data/log
sudo chmod 700 /var/lib/pgsql/data/log
```

### 3.4 PostgreSQLの再起動

設定変更を反映させるため、PostgreSQLを再起動します。

```bash
sudo systemctl restart postgresql
```

---

## 4. データベースの準備

PostgreSQLにログインし、アプリケーション用のユーザーおよびデータベースを作成します。

```bash
# postgresユーザーに切り替えてpsqlを起動
sudo -u postgres psql
```

SQLコマンド例:
```sql
-- ユーザーの作成
CREATE USER myuser WITH PASSWORD 'your_password';

-- データベースの作成
CREATE DATABASE mydatabase;

-- ユーザーに権限付与
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;
```

---

## 5. データ移行

1. **Herokuからのデータエクスポート**  
   Heroku上で`pg_dump`等のツールを利用し、データベースのエクスポートを実施します。

2. **AWSへのデータインポート**  
   エクスポートしたデータを、AWS上のPostgreSQLに`psql`などのツールでインポートします。

※ データ移行の詳細手順は、実際のデータ量や環境に合わせて適宜調整してください。

---

## 6. 注意事項

- **セキュリティ対策**  
  - セキュリティグループの設定で必要最小限のIPアドレスのみ許可  
  - 強固なパスワードの設定  
  - リモート接続時のIP制限の徹底

- **バックアップ**  
  - 移行前に必ず現行データのバックアップを取得  
  - 移行後も定期的なバックアップを実施

- **コスト管理**  
  - Elastic IPは関連付けがない場合に課金対象となるため注意  
  - EC2の利用料金体系を把握する

---

以上の工程で、HerokuからAWSへのPostgreSQL移行を実施できます。  
また、AWS上でのPostgreSQL運用については、[こちらの記事](https://qiita.com/TANIOKA_Akihiro/items/e62fa269086a03ad5b9d)でRDSとEC2直接インストールの選択肢を比較検討しているので、運用方針を決める際の参考にしてください。

この記事が、移行作業やAWSでのデータベース運用の一助となれば幸いです。