カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

Digdagで実行したEmbulkのログをCloudWatchに転送する

過去の記事でDigdagのアクセスログをCloudWatchに送るという設定をやりましたが、今回はEmbulkの実行ログをCloudWatchに転送して、エラー時はアラートを出すように設定したいと思います。

>>アラートは次回の記事で書くことにしました。

Cloudwatchを設定した時の記事
www.capybara-engineer.com

Embulkの実行ログを出力した時の記事
www.capybara-engineer.com

実施作業

CloudWatch設定確認

まずは以前の記事で設定したCloudWatchの設定を確認します。
設定はSystems Managerのパラメータストアから確認することができます。
f:id:live-your-life-dd18:20201105150436p:plain


サーバ上だと以下のパスに格納されています。

# C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs

f:id:live-your-life-dd18:20201105134130p:plain

CloudWatch設定修正

今回はAWSのコンソールから設定を変更します。
SSMのパラメータストアから対象の設定を開いて、編集ボタンを押下します。
f:id:live-your-life-dd18:20201105150459p:plain

編集画面に遷移するので、値の項目に記載してある設定を適当にエディタなどにコピペして編集します。
f:id:live-your-life-dd18:20201105134340p:plain

以下のcollect_list項目にEmbulkの実行ログのパスと出力先を設定します。
f:id:live-your-life-dd18:20201105134555p:plain

修正後変更を保存します。

"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」に配布するパラメータストアの名前を設定するのを忘れないようにします。
f:id:live-your-life-dd18:20201105142043p:plain


Run Commandが成功することを確認します。
f:id:live-your-life-dd18:20201105142233p:plain


サーバに配布されたConfigファイルでも変更が反映されていることを確認できました。
f:id:live-your-life-dd18:20201105142346p:plain

ログ転送確認

(一部文字化けしていますが)コンソールからログが転送されていることが確認できます。
f:id:live-your-life-dd18:20201105142717p:plain


追加でEmbulkを実行してみます。
f:id:live-your-life-dd18:20201105142809p:plain


以下のようなログがサーバのローカルに出力されました。
f:id:live-your-life-dd18:20201105142839p:plain


(一部文字化けしていますが)追加されたログも出力されているようなので、問題なさそうです。
f:id:live-your-life-dd18:20201105142916p:plain

文字化け解消

なんで文字化けされているか確認してみます。

まず出力されているログファイルの文字コードを確認します。
見る限りはUTF-8で出力されているようにみえます。
f:id:live-your-life-dd18:20201105143300p:plain


色々調べてみるとログの転送時にエンコーディングをするように、パラメータに設定する必要があるようです。
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"
				}
			]
		}
	}
},



ダメでした。文字化けは解消されてないです。
f:id:live-your-life-dd18:20201105144626p:plain


その後あれこれ試してみて、バッチのログ出力を以下のように修正したところ、文字化けがなくなりました。

function LogMessage($Message , $Log){
    Write-Output "$(Get-Date -Format G): $Message"
    Write-Output "$(Get-Date -Format G): $Message" | Out-File $Log -Append -Encoding utf8
}

f:id:live-your-life-dd18:20201105145727p:plain


おそらくですが、出力した時の文字コードがおかしかったので、正しくエンコードした上で出力されたことで、文字化けがなくなったのではと思います。

感想及び所感

ちょっと長くなったので、次回EmbulkでのエラーをCloudWatchで検知できるように設定していきます。