経緯
EC2上に建てたkubernetesのログをEC2インスタンスの外に保存したかった時のお話。
EKSやGKEを使えばそのへんサクッと出来るみたいですが、今回はそれらを利用しない前提です。
半分くらいポリシーとロールの作成方法の説明になってしまいましたが、備忘録として載せておきます。
手順
S3バケットの作成
ない場合は作成しておく
EC2にIAMロールをアタッチする
保存先のS3を操作するためのIAMロール。
既に使えそうなロールがある場合はそれを利用しても良い。
ない場合は [IAMロールの割り当て/置換] から作成出来る。
- [新しい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