過去の記事でDigdagのアクセスログをCloudWatchに送るという設定をやりましたが、今回はEmbulkの実行ログをCloudWatchに転送して、エラー時はアラートを出すように設定したいと思います。
>>アラートは次回の記事で書くことにしました。
Cloudwatchを設定した時の記事
www.capybara-engineer.com
Embulkの実行ログを出力した時の記事
www.capybara-engineer.com
実施作業
CloudWatch設定確認
まずは以前の記事で設定したCloudWatchの設定を確認します。
設定はSystems Managerのパラメータストアから確認することができます。

サーバ上だと以下のパスに格納されています。
# C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs

CloudWatch設定修正
今回はAWSのコンソールから設定を変更します。
SSMのパラメータストアから対象の設定を開いて、編集ボタンを押下します。

編集画面に遷移するので、値の項目に記載してある設定を適当にエディタなどにコピペして編集します。

以下のcollect_list項目にEmbulkの実行ログのパスと出力先を設定します。

修正後変更を保存します。
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "C:\\opt\\digdag\\logs\\accesslog\\access.log",
"log_group_name": "digdag-access_log",
"log_stream_name": "{instance_id}"
},
{
"file_path": "C:\\opt\\embulk\\logs\\embulk_run_*.log",
"log_group_name": "embulk-run_log",
"log_stream_name": "{hostname}_embulk"
}
]
}
}
},
CloudWatch設定反映
以下の記事を参考にCloudWatchの変更をサーバに設定していきます。(「SSM から config.json のパラメータを配信する」の部分です)
blog.serverworks.co.jp
記事に従ってコマンドを実行します。
途中「Optional Configuration Location」に配布するパラメータストアの名前を設定するのを忘れないようにします。

Run Commandが成功することを確認します。

サーバに配布されたConfigファイルでも変更が反映されていることを確認できました。

ログ転送確認
(一部文字化けしていますが)コンソールからログが転送されていることが確認できます。

追加でEmbulkを実行してみます。

以下のようなログがサーバのローカルに出力されました。

(一部文字化けしていますが)追加されたログも出力されているようなので、問題なさそうです。

文字化け解消
なんで文字化けされているか確認してみます。
まず出力されているログファイルの文字コードを確認します。
見る限りはUTF-8で出力されているようにみえます。

色々調べてみるとログの転送時にエンコーディングをするように、パラメータに設定する必要があるようです。
qiita.com
以下のようにエンコーディングパラメータを追加して、再度設定を更新して再度ログを送ってみます。
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "C:\\opt\\digdag\\logs\\accesslog\\access.log",
"log_group_name": "digdag-access_log",
"log_stream_name": "{instance_id}",
"encoding": "utf_8"
},
{
"file_path": "C:\\opt\\embulk\\logs\\embulk_run_*.log",
"log_group_name": "embulk-run_log",
"log_stream_name": "{hostname}_embulk",
"encoding": "utf_8"
}
]
}
}
},
ダメでした。文字化けは解消されてないです。

その後あれこれ試してみて、バッチのログ出力を以下のように修正したところ、文字化けがなくなりました。
function LogMessage($Message , $Log){
Write-Output "$(Get-Date -Format G): $Message"
Write-Output "$(Get-Date -Format G): $Message" | Out-File $Log -Append -Encoding utf8
}
おそらくですが、出力した時の文字コードがおかしかったので、正しくエンコードした上で出力されたことで、文字化けがなくなったのではと思います。
感想及び所感
ちょっと長くなったので、次回EmbulkでのエラーをCloudWatchで検知できるように設定していきます。