弊社ではデータを AWS の RDS を使って管理しています。バックアップは自動で取ってくれるんですが、RDS では残せるバックアップのスナップショット数が決まっているのでもう少し過去のバックアップも取りたい。気軽にバックアップを S3 に保存することは出来ないものか。

RDS


追記:14:12
RDS のスナップショットを手動で取ったりすれば良いんですけど、アカウントが悪用されたりして全部消えちゃったら怖いなぁと。そういう背景もあって念のため S3 上にも置いておきたいなぁと思った次第です(*゚∀゚)

追記:14:17
バックアップのスナップショット数増やすことも可能みたいですね。


追記ここまで

「そういうの無いかなー」探してみたら rds-s3-backup というライブラリがあったのでそれを少し変更して使ってみることにしました。sasata299/rds-s3-backup

実際は EC2 のインスタンス上で cron で実行してるんですが、その処理の流れはこんな感じです。xxx-s3-dump-server は任意の RDS のインスタンスを指定してそこから復元しています。

1. mysqldump を実行する RDS のインスタンス (xxx-s3-dump-server) を起動する
2. xxx-s3-dump-server に対して EC2 のインスタンスから mysqldump を実行する
3. mysqldump して得られたファイルをバックアップとして S3 にアップロードする
4. xxx-s3-dump-server を終了する

実行するのは簡単で、config.yml(設定ファイル)をこんな感じで用意してあげて、

aws_access_key_id: 'AWS_ACCESS_KEY_ID'
aws_secret_access_key: 'AWS_SECRET_ACCESS_KEY'
rds_instance_id: 'my-rds' # このインスタンスからmysqldumpを実行するRDSのインスタンスを復元する
s3_bucket: 'backup' # バックアップを保存するバケット名
mysql_database: 'database'
mysql_username: 'username'
mysql_password: 'password'
db_security_group_names:
  - 'my-rds-security-group' # 起動したRDSインスタンスに適用させるセキュリティグループ
db_instance_class: 'db.m1.small'
dump_ttl: 5 # S3に残したいバックアップの世代数

以下のようなコマンドを実行するだけです。

bundle exec ruby rds-s3-backup.rb s3_dump --config-file=config.yml

IAM を使っていたりする場合には IAM の設定も必要ですね。こんな感じにしています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1388107723000",
      "Effect": "Allow",
      "Action": [
        "rds:DescribeDBInstances",
        "rds:RestoreDBInstanceToPointInTime"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "Stmt1388107751000",
      "Effect": "Allow",
      "Action": [
        "rds:DeleteDBInstance",
        "rds:ModifyDBInstance"
      ],
      "Resource": [
        "arn:aws:rds:us-east-1:221673199380:db:*-s3-dump-server"
      ]
    },
    {
      "Sid": "Stmt1388107776000",
      "Effect": "Allow",
      "Action": [
        "rds:ModifyDBInstance"
      ],
      "Resource": [
        "arn:aws:rds:us-east-1:221673199380:secgrp:xxxxx"
      ]
    }
  ]
}

アクションの指定に "rds:ModifyDBInstance" が必要だったり(これはセキュリティグループに対しても必要っぽい)、最後に RDS インスタンスを終了させるために "rds:DeleteDBInstance" が必要だったりします。この辺は怖いので最低限のリソースにだけ許可している感じです。

主にセキュリティグループの指定が大変だった。。起動時には指定出来ないんですね!><
このエントリーをはてなブックマークに追加