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から、改めてその名前に一致するロググループが存在するかどうかをチェックすることにする。

Bashスクリプトでの例。

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に関する私の記事