Help us understand the problem. What is going on with this article?

ファイルをEC2からS3にcronで定期バックアップする

経緯

EC2上に建てたkubernetesのログをEC2インスタンスの外に保存したかった時のお話。
EKSやGKEを使えばそのへんサクッと出来るみたいですが、今回はそれらを利用しない前提です。
半分くらいポリシーとロールの作成方法の説明になってしまいましたが、備忘録として載せておきます。

手順

S3バケットの作成

ない場合は作成しておく

EC2にIAMロールをアタッチする

保存先のS3を操作するためのIAMロール。
既に使えそうなロールがある場合はそれを利用しても良い。
ない場合は [IAMロールの割り当て/置換] から作成出来る。
スクリーンショット 2020-03-05 12.21.31.png

  • [新しいIAMロールを作成する]
  • [ロールの作成]
  • 「EC2」を選択して [次のステップ:アクセス権限]
  • [ポリシーの作成]
    • サービス
      • S3
    • アクション
      • リスト/ListBucket
      • 読み込み/GetObject
      • 書き込み/PutObject
    • リソース
      • bucket [ARNの追加]
      • object [ARNの追加]
        • ディレクトリを制限する場合は ObjectName に入れる
        • 制限しない場合は すべて にチェックを入れる
  • [ポリシーの確認]
  • 適当な名前をつけて [ポリシーの作成]
  • 作成が完了してポリシー一覧に戻ったら、ロール一覧に戻る
  • ロール一覧を更新し、作成したポリシーを選択
  • [次のステップ:タグ] → [次のステップ:確認]
  • 適当なロール名をつけて [ロールの作成]
  • 作成が完了しロール一覧に戻ったら、IAMロールの割り当て/置換画面に戻る
  • IAMロール一覧を更新し、作成したロールを選択
  • [適用]

aws s3 sync を使う

バケットとディレクトリを指定すると、その内容を同期してくれる超便利コマンド。
指定のディレクトリとバケットの内容を比較し、バケットにないもののみアップロードしてくれます。
指定の同期先からデータが消えたとしても、S3上のオブジェクトは削除されないので安心。

今回はこれをcronで定期実行することで、EC2上のログをS3にアップロードします。

  • awsコマンドが無い場合はインストールする [手順]
  • aws sts get-caller-identity でアタッチしたIAMロールがちゃんとあるか確認
  • aws s3 sync EC2の同期先 s3://バケット名/ディレクトリ名(あれば) で同期されるか確認

cronを設定する

aws s3 sync が使えることが確認出来たら、あとはこれをcronに定期実行させるだけです。

  • crontab -e で設定ファイルを開いて以下のように書き込む
*/1 * * * * /bin/bash -c ". /ホームディレクトリ/.bash_profile; 成功したawsコマンド"

今回は1分置きの設定。
最初に .bash_profile を読み込んでいるのはパスの設定を反映させるため。
awsコマンドを絶対パスで書くでも良かったかもしれない。

  • crontab -l で設定済のジョブを確認

おまけ

cronの実行ログを確認したい場合は、 crontab -e で開いた設定の末尾にこいつを書く。

> /ログの出力先 2>&1
bambis13s
毎日ゴキゲンに修行中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away