Windowsのフォルダとs3バケットを定期的に同期させる

記事タイトルとURLをコピーする

今回は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への同期に成功しました。」と確認できますね。(エラーとあるのは、失敗した時のログになります。)

f:id:swx-watanabe:20210201134330p:plain

Step2.タスクの作成

次に定期実行できるようにタスクスケジューラにStep1で作成したスクリプトを登録します。

タスクスケジューラを開く

まず、タスクスケジューラを開いたら、適当な名前でフォルダを作成します。(今回はCustom)

f:id:swx-watanabe:20210201134341p:plain

全般タブ

次にタスクの作成に入ります。
なお、今回はAdministratorユーザーで実行するので「最上位の特権で実行する」のチェックは外していますが、他のユーザーの場合は必要かもしれません。

f:id:swx-watanabe:20210201134356p:plain

トリガータブ

トリガーの設定をします。
ここでは毎時0分に動作するように設定してみました。


f:id:swx-watanabe:20210201134434p:plain

操作タブ

操作の設定をします。

プログラム/スクリプト

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

引数の追加

-c "C:\script\s3sync_system-a.ps1"

f:id:swx-watanabe:20210201134457p:plain

 タスクの保存

タスク設定を保存します。
ここでパスワードを求められます。

f:id:swx-watanabe:20210201134550p:plain

完成

f:id:swx-watanabe:20210201134601p:plain

終わりに

冒頭に書いた通り、ベタですが、よく使える感じのスクリプト・手順が書けたのではないかと思います。
今後のステップとしては、ログをフィルタして通知といったところでしょうか。
AWS & Windows も、なかなかいいですね。

渡辺 信秀(記事一覧)

2017年入社 / 地味な内容を丁寧に書きたい