今回はWindowsのフォルダにあるファイルを定期的にs3バケットに同期させる方法について書きます。
ベタな内容とは思いますが、日頃はMacやLinuxな方には新鮮な内容かもしれません。
前提とする環境
・s3バケットは作成済み
・Windows Server 2012以降
・Windows上にawscliはインストール済み(インストーラ)
・Windows上にaws configureで設定済み
・IAMユーザーにs3に対する適切な権限がある
やってみよう
下記の例では、system-aという仮のシステムに関するものです。
バケット名とかもsystem-aにしていますが、例なのでそこらへんは各自の名前に置き換えてください。
Step1.スクリプト作成
このスクリプトの機能は、2つです。
・指定したフォルダをs3バケットに同期する
・成功、失敗をWindowsイベントログに書き込む 下記スクリプト内の変数を調整していただければ、動くはずです。
# s3バケットを指定
$s3bucket = "s3://system-a"
# ローカルフォルダを指定
$localfolder = "c:\data\system-a"
# イベントログの名前
$eventlog = "s3sync_system-a"
# IAMユーザーのプロファイルを指定
$iamprofile = "system-a"
# イベントログが存在しない場合は作成する。
if ([System.Diagnostics.EventLog]::SourceExists($eventlog) -eq $false){
New-EventLog -LogName Application -Source $eventlog
}
# ローカルフォルダとs3バケットを同期する。
aws s3 sync $localfolder $s3bucket --profile $iamprofile
# 同期の成功・失敗を確認し、イベントログにメッセージを書き込む。
if ($?) {
Write-Output "s3への同期に成功しました。"
Write-EventLog -LogName Application -EntryType Information -Source $eventlog -EventId 0 -Message "s3への同期に成功しました。"
} else {
Write-Output "s3への同期に失敗しました。"
Write-EventLog -LogName Application -EntryType Error -Source $eventlog -EventId 1 -Message "s3への同期に失敗しました。"
}
ちなみに「EventId 0」は情報、「EventId 1」はエラーとして、イベントログに記録されました。
イベントログは私もまだよく理解していませんが、最低限の分類はできたかなと思います。 試しに一度実行してみましょう。
PS C:\Users\Administrator> c:\script\s3sync_system-a
upload: ..\..\data\system-a\testfile1.txt to s3://system-a/testfile1.txt
upload: ..\..\data\system-a\testfile2.txt to s3://system-a/testfile2.txt
s3への同期に成功しました。
イベントログも見てみましょう。
「s3への同期に成功しました。」と確認できますね。(エラーとあるのは、失敗した時のログになります。)
Step2.タスクの作成
次に定期実行できるようにタスクスケジューラにStep1で作成したスクリプトを登録します。
タスクスケジューラを開く
まず、タスクスケジューラを開いたら、適当な名前でフォルダを作成します。(今回はCustom)
全般タブ
次にタスクの作成に入ります。
なお、今回はAdministratorユーザーで実行するので「最上位の特権で実行する」のチェックは外していますが、他のユーザーの場合は必要かもしれません。
トリガータブ
トリガーの設定をします。
ここでは毎時0分に動作するように設定してみました。
操作タブ
操作の設定をします。 プログラム/スクリプト
・%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加
・-c "C:\script\s3sync_system-a.ps1"
タスクの保存
タスク設定を保存します。
ここでパスワードを求められます。
完成
終わりに
冒頭に書いた通り、ベタですが、よく使える感じのスクリプト・手順が書けたのではないかと思います。
今後のステップとしては、ログをフィルタして通知といったところでしょうか。
AWS & Windows も、なかなかいいですね。