はじめに
CloudWatch Logsと言えば、AWSを使っている人は必ずと言っていいほどお世話になるログ管理のサービスです。
サービス自体はシンプルでとても便利なんですが、なぜかURLがちょっと特殊な作りになっていて、僕自身、任意のログストリームページのURLを動的に生成しようとしたとき「ん?これどうなってんの・・・?」とはじめは戸惑いました。
ちょっとしたTips程度ですが、同様のことで悩んでいる人がいるかもなので記事にしておきます。
CloudWatch LogsのURL構造はどうなっているか
URLは以下のようになっています。
ちなみにhoge-lambda
というLambdaを実行したときのログストリームのものです。
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logsV2:log-groups/log-group/$252Faws$252Flambda$252Fhoge-lambda/log-events/2020$252F10$252F27$252F$255B$2524LATEST$255D542bf48a98944249b069342e12861b99
分かりやすくするために、以下のようにURLを分解してみます。
こうすると定型部分 + ロググループ名 + 定型部分 + ログストリーム名
の構造になっていることが分かります。
1. 定型部分
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logsV2:log-groups/log-group/
2. ロググループ名
$252Faws$252Flambda$252Fhoge-lambda
3. 定型部分
/log-events/
4. ログストリーム名
2020$252F10$252F27$252F$255B$2524LATEST$255D542bf48a98944249b069342e12861b99
ロググループ名・ログストリーム名はURLエンコードされている
次に、ロググループ名とログストリーム名に注目します。
コンソール画面から正しいロググループ名とログストリーム名を引っ張ってきてそれぞれを比較してみます。
正しいロググループ名
/aws/lambda/hoge-lambda
URLに含まれているロググループ名
$252Faws$252Flambda$252Fhoge-lambda
正しいログストリーム名
2020/10/27/[$LATEST]542bf48a98944249b069342e12861b99
URLに含まれているログストリーム名
2020$252F10$252F27$252F$255B$2524LATEST$255D542bf48a98944249b069342e12861b99
上記を見比べると、それぞれ以下のように変換されていることが分かりました。
しかし、この変換をするようなエンコード方式ってどんなだろう・・・となります。
/ -> $252F
[ -> $255B
$ -> $2524
] -> $255D
これ、実はURLエンコードを2回実施されているんです。
途中経過も含めると以下のように変換されています。
1発目 2発目
/ -> %2F -> $252F
[ -> %5B -> $255B
$ -> %24 -> $2524
] -> %5D -> $255D
つまり、CloudWatch Logsで使われているURLは以下のように作られていることが分かります。
定型部分 + URLエンコードを2回実施したロググループ名 + 定型部分 + URLエンコードを2回実施したログストリーム名
まとめ
重要なのは、ロググループ名とログストリーム名の部分のみをURLエンコード×2回実施すればいいという点だけです。
ここさえ抑えておけば、あとは定型部分と結合するだけで動的にURLが生成できるので簡単ですね。
CloudWatch LogsのSubscription Filterなどを使ってログ監視を実装するのはよくあるユースケースかと思いますが、アラート通知する内容に生成したログストリームページのURLを埋め込んであげると、エラー発生時のログ確認が素早くできるようになるので個人的にオススメです。