特定ディレクトリ以下のファイルを定期的にS3に同期する


はじめに

特定のディレクトリの内容をS3にバックアップしたかったので試してみました。
(Dropboxのようにファイル変更時に同期とまではいかず、cronで定期的に同期させました)

環境は

  • OS
    Mac macOS Sierra(v10.12.6)
  • aws cliバージョン
    aws-cli/1.15.10 Python/3.6.5 Darwin/16.7.0 botocore/1.10.10

バックアップ用のバケットとIAMユーザーを作成

まず、バックアップ用のS3バケットを作成します。

$ aws s3 mb s3://[バケット名]
make_bucket: [バケット名]

次に、自動実行用のユーザーを作成します。
これはAWSマネジメントコンソールにログインして作成しました。

  • マネジメントコンソールへのアクセスはオフに設定
  • アクセスキーとシークレットキーをダウンロードしておく

ユーザーのインラインポリシーについては下記のようにしました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::[上で作成したバケット名]/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::[上で作成したバケット名]"
        }
    ]
}

シェルスクリプトの作成

下記のようなシェルスクリプトを作成し、任意のディレクトリに保存します。

#/bin/bash
export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=[作成したユーザーのアクセスキー]
export AWS_SECRET_ACCESS_KEY=[作成したユーザーのシークレットキー]
/usr/local/bin/aws s3 sync [同期させたいディレクトリの絶対パス] s3://[上で作成したバケット名]/

cronの設定

crontabを編集します。

$ export EDITOR=emacs # vimとかでもOK
$ crontab -e

エディタが立ち上がるので下記の二行を追加して保存し終了します。

# 1時間おきにS3同期
0 * * * * /bin/bash [シェルスクリプトの絶対パス] >> /tmp/sync-s3.log

確認のコマンドを打ってみて、先程入力した内容が反映されていれば成功です。

$ crontab -l
# 1時間おきにS3同期
0 * * * * /bin/bash [シェルスクリプトの絶対パス] >> /tmp/sync-s3.log

バージョニングの有効化

S3バケットに対し、バージョニングを有効にしておけば、同期時に自動的にファイルのバージョニングを行ってくれます。
そのため、必要に応じて過去のバージョンを取得することが可能になります。

$ aws s3api put-bucket-versioning --bucket [バケット名] --versioning-configuration Status=Enabled

結果

下記のようにアップロードに成功したというログが表示されれば成功です。

$ tail -f /tmp/sync-s3.log
upload: [同期元ファイル] to s3://[バケット名]/[同期先ファイル]

その他

Macでcronの実行ログ(/var/log/cron.log)を出力したいときは下記参照。
https://qiita.com/m0a/items/00b099b3025422a6c037
cronの実行ログ設定中にSystem Integrity ProtectionOperation not permittedエラーが表示された場合は下記参照。
https://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8

参考