AWS CloudWatch Logsでロググループが存在するかどうかをスクリプトで判定
AWS CloudWatch Logsでロググループが存在するかどうかで、スクリプトを分岐させたいとする。(ロググループが存在しなければロググループを作成というようなケース)
aws logs describe-log-groups
コマンドでその名前のロググループを取得して、存在を判定したいのだが、このコマンドはロググループの名前をずばり指定するのではなく、プレフィックスを指定することしかできない。以下のようになる。
$ aws logs describe-log-groups --log-group-name-prefix /aws-glue/jobs/logs-v2 { "logGroups": [ { "logGroupName": "/aws-glue/jobs/logs-v2", "creationTime": 1580459203888, "metricFilterCount": 2, "arn": "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:/aws-glue/jobs/logs-v2:*", "storedBytes": 99999999 }, { "logGroupName": "/aws-glue/jobs/logs-v2-xxxxxxxx", "creationTime": 1595463386005, "metricFilterCount": 0, "arn": "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:/aws-glue/jobs/logs-v2-xxxxxxxx:*", "storedBytes": 99999999 } ] }
したがって、このコマンドの出力するJSONから、改めてその名前に一致するロググループが存在するかどうかをチェックすることにする。
loggroupname=/aws-glue/jobs/logs-v2 if [ $(aws logs describe-log-groups --log-group-name-prefix $loggroupname | jq "[.logGroups[] | select(.logGroupName==\"$loggroupname\")] | length") != 0 ]; then echo "Exists" else echo "Not exist" fi
PowerShellスクリプトでの例。
$loggroupname = "/aws-glue/jobs/logs-v2" if (aws logs describe-log-groups --log-group-name-prefix $loggroupname | ConvertFrom-Json | %{ $_.logGroups } | Where-Object { $_.logGroupName -eq $loggroupname }) { echo "Exists" } else { echo "Not exist" }
ロググループ存在しない場合に限りロググループを作成する方法がわからなかったので、書いた。
aws logs create-log-group
はすでに存在するロググループ名を指定するとエラーメッセージだして、エラー終了してしまう。エラーを無視するのは、それ以外の予期しないエラーを見逃してしまうので、避けたかった。
リンク
CloudWatchに関する私の記事