`aws-cli`でR2にバックアップできたので備忘録。
## 大まかな手順
1. R2バケットの作成~API取得
2. aws-cliのインストール(前記事でインストールしてたら不要)
3. credentialsの記入or書き換え
4. bashファイルの作成or変更
## 詳細な流れ
### 1.R2バケットの作成~API取得
#### バケット作成
Cloudflareにログイン後、左側のメニューから「R2>概要」に移動し、画面中央にある「バケットを作成する」ボタンを押してバケット名(名前)を入力。
#### API取得
バケットを作成したら、概要のページに戻ります。右側のメニューから「R2 APIトークンの管理」をクリックし、右上の「APIトークンを作成する」を選択し、以下のように設定を行う。
##### 設定項目
- トークン名:APIの名前。自分が識別できる名前を入力
- 権限:オブジェクトの読み取りと書き込み
- バケットの指定:特定のバケットのみに適用>2で作ったバケット名を選択
設定が終わったら右下の「APIトークンを作成する」をクリックし、次のページで表示されるAPIをメモしておきます。
> [!warning]
> 初回しか表示しないので、必ずコピーしてメモ帳などに保存すること!
### 2.aws-cliのインストール
rootユーザーでインストール。本来なら別のユーザー、私だったら`bot`ユーザーでやるのがいいんだけどね。
- [Linux での AWS CLI バージョン 1 のインストール、更新、アンインストール AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/install-linux.html#install-linux-pip)
### 3.credentialsの記入or書き換え
#### 新規作成の場合
ホームディレクトリに戻っていることを確認、(root@aaa:~$)の`~`の部分が`~`だけになってればOKです。ディレクトリー`.aws`を作成、してNanoで`.aws/credentials`を編集します。
```
$ mkdir .aws
$ nano .aws/credentials
```
`credentials`の内容はこんな感じで記入して保存します。
```
[default]
aws_access_key_id=(アクセスキー)
aws_secret_access_key=(シークレットキー)
region = auto
```
#### 書き換えの場合
AWSからの切り替えの場合、すでにファイルが作成されていると思うので、一度バックアップを取ります
```
$ cd .aws
$ cp credentials credentials.old
```
`credentials`が現行の設定ファイル、`credentials.old`がバックアップファイルになります。このまま、`nano credentials`で編集、内容は上記の新規作成と同じ要領で記載します。
### 4.bashファイルの作成or変更
次にバックアップスクリプトを作成・変更します。`/usr/local/bin`に保存・`nano backup.sh`でファイルを作成しています。
```
$ cd /usr/local/bin
$ nano backup.sh
```
`backup.sh`の中身はこんな感じに記載。ちなみに私は`bot`ユーザーを作成・awsを動してるので注意。
``` sh
#!/bin/bash
set -e # エラー時にスクリプトを終了
set -o pipefail # パイプ処理のエラーを検出
# 時刻取得
TIME=$(date +"%Y%m%d%H%M")
# バックアップディレクトリ
BACKUP_DIR="/var/backup/"
BACKUP_FILE="$TIME-backup.gz"
R2_BUCKET="s3://<バケット名>/db"
R2_ENDPOINT="<エンドポイント>"
# PostgreSQLバックアップ
echo "Starting backup..."
sudo -u postgres bash -c "
mkdir -p $BACKUP_DIR
cd $BACKUP_DIR
pg_dumpall | gzip -c > $BACKUP_FILE
"
# 所有権・パーミッション変更
chown bot:bot "$BACKUP_DIR/$BACKUP_FILE"
chmod 600 "$BACKUP_DIR/$BACKUP_FILE"
# botアカウントに切り替え・venv起動
su - bot << BASH
# S3転送
echo "Uploading backup to S3..."
aws s3 cp "$BACKUP_DIR/$BACKUP_FILE" "$R2_BUCKET" --endpoint-url "$R2_ENDPOINT"
echo "Backup complete."
BASH
```
**2025/11/19 bashスクリプト変更**
設定ファイルにバケット名とエンドポイントを追加して保存します。変更が終わったらパーミッションを755に変更(初回のみ)し、bashファイルを実行してみます。
```
$ chmod 755 backup.sh
$ bash backup.sh
```
無事に送信できたら完了です、お疲れさまでした。
## 補足:cronを設定する
rootユーザーに切り替え、`/etc/cron.d`に移動して、`backup`ファイルを作成。
```
$ exit
$ cd /etc/cron.d
$ nano backup
```
nanoで`backup`を開いたら、下記の情報を記入。
``` cron
SHELL=/bin/sh
MAILTO=""
00 02 * * * root sh /usr/local/bin/backup.sh
05 02 * * * root find /var/backup -name '*.gz' -mtime +14 -delete
```
`backup.sh`を実行して、14日前のバックアップデーターを削除します。`00 02`もしくは`05 02`の部分はお好きなように変更してください。
## 関連記事
- [[Mastodon・Misskeyのデータベースをバックアップする]]
- [[Mastodon・Misskeyのデータベースをリストアする]]
- [[Mastodon(kmyblue)のアップデートをおさらいする]]
- [[Mastodonの「.env.production」ファイルをR2に保存する]]