お金をかけずにサーバーの勉強をしよう

LocalStackで AWSの CloudWatch Logs

2025年8月14日

メニューへ戻る

LocalStackを使って AWS CloudWatch Logsを味わってみます。

LocalStackを使う (AWSエミュレーター)」で AWSのエミュレーター環境を構築し、
LocalStackで AWSの Lambda」で Lamdaで JavaScriptの関数を実行してみました。

ここでは LocalStackで Lambdaのところで作った JavaScriptの関数からコンソールに出した「Hello World!」を CloudWatch Logsで見てみましょう。

環境はこの通り。

LocalStackで Lambdaファンクションを実行した後の状態からスタートです。

Lambdaで実行したプログラムのログについて、以下のドキュメントにこんな記載があります。
Lambda 関数ログを CloudWatch Logs に送信する

デフォルトでは Lambda はすべての関数呼び出しについてログを自動的にキャプチャし、CloudWatch Logs に送信します。

ということで、Lambdaで実行したプログラムがコンソール出力したメッセージは、CloudWatch Logsに記録されてそうなんですよね。

であれば運用サイドではログを CloudWatch側で見たいものです。
どうにかならないでしょうか。

LocalStackの CloudWatch Logsのドキュメントはこちら。
CloudWatch Logs

具体的なとり方の方法は書いてないですが、やれそうな感じがします。


AWS CLI(awsコマンドのこと)には[logs]ってオプションがありまして、これが ColudWatch Logsのログを見るために使えそうです。

LocakStackでは[awslocal logs]ってことになります。

[aws logs]コマンドのリファレンスはこちら。
logs

ちょっとやってみましょう。

CloudWatch Logsには、ロググループって呼ばれるログの容れ物の観念があります。
Lambdaの説明によると、Lambdaからのログは自動的にロググループができるようになっており、それは[/aws/lambda/]という名前に成っているのだと。

という訳で、まずどんなロググループがあるのか見てみました。
[aws logs describe-log-groups]コマンドを使います。

(localstack-env) subro@Lubuntu2404:~$:~/work/localstack$ awslocal logs describe-log-groups
{
    "logGroups": [
        {
            "logGroupName": "/aws/lambda/hello-world",
            "creationTime": 1755174298117,
            "metricFilterCount": 0,
            "arn": "arn:aws:logs:us-east-1:000000000000:log-group:/aws/lambda/hello-world:*",
            "storedBytes": 344
        }
    ]
}

ドキュメントの通りに作られていました。(ピンク色の箇所)

ログを見るコマンドでは、ロググループ以外にログストリーム名というのも必要なようです。
特定のロググループのログストリーム名を取得するのは
[aws logs describe-log-streams]コマンドになります。

(localstack-env) subro@Lubuntu2404:~$:~/work/localstack$ awslocal logs describe-log-streams --log-group-name /aws/lambda/hello-world
{
    "logStreams": [
        {
            "logStreamName": "2025/08/14/[$LATEST]1a13a170d38ec77c215e23682d0004c9",
            "creationTime": 1755174298122,
            "firstEventTimestamp": 1755174298088,
            "lastEventTimestamp": 1755174298088,
            "lastIngestionTime": 1755174298127,
            "uploadSequenceToken": "1",
            "arn": "arn:aws:logs:us-east-1:000000000000:log-group:/aws/lambda/hello-world:log-stream:2025/08/14/[$LATEST]1a13a170d38ec77c215e23682d0004c9",
            "storedBytes": 344
        }
    ]
}

これでログループ名とログストリーム名が分かりましたので、ログ自体を取ってみましょう。
コマンドは[aws logs get-log-events]です。

(localstack-env) subro@Lubuntu2404:~$:~/work/localstack$ awslocal logs get-log-events --log-group-name /aws/lambda/hello-world --log-stream-name 2025/08/14/[$LATEST]1a13a170d38ec77c215e23682d0004c9

An error occurred (ResourceNotFoundException) when calling the GetLogEvents operation: The specified log group does not exist.

ロググループが無いって言ってますね。
上のコマンドで取ってきたものなのに。

ちょっとハマりましたが、Stack Overflow に同じ悩みをもった人が!
aws logs: The specified log group does not exist

これによりますと、ロググループ名じゃなくてログストリーム名が間違っていて、それに引っ張られて「ロググループが無い」って言ってるらしいのです。

問題の箇所は「$LATEST」の「$」で、これをエスケープしたら解決したってありました。

やってみます。

(localstack-env) subro@Lubuntu2404:~$:~/work/localstack$ awslocal logs get-log-events --log-group-name /aws/lambda/hello-world --log-stream-name 2025/08/14/[\$LATEST]1a13a170d38ec77c215e23682d0004c9
{
    "events": [
        {
            "timestamp": 1755174298088,
            "message": "START RequestId: 9bd40aa2-56bd-412e-bf86-fcc82de5399c Version: $LATEST\n",
            "ingestionTime": 1755174298127
        },
        {
            "timestamp": 1755174298088,
            "message": "2025-08-14T12:24:58.076Z\t9bd40aa2-56bd-412e-bf86-fcc82de5399c\tINFO\tHello World!\r\n",
            "ingestionTime": 1755174298127
        },
        {
            "timestamp": 1755174298088,
            "message": "END RequestId: 9bd40aa2-56bd-412e-bf86-fcc82de5399c\n",
            "ingestionTime": 1755174298127
        },
        {
            "timestamp": 1755174298088,
            "message": "REPORT RequestId: 9bd40aa2-56bd-412e-bf86-fcc82de5399c\tDuration: 8.42 ms\tBilled Duration: 9 ms\tMemory Size: 128 MB\tMax Memory Used: 128 MB\t\n",
            "ingestionTime": 1755174298127
        }
    ],
    "nextForwardToken": "f/00000000000000000000000000000000000000000000000000000003",
    "nextBackwardToken": "b/00000000000000000000000000000000000000000000000000000000"
}

あぁ、出ました出ました。

LocalStackで AWSの Lambda」で取得したログと同じものが 1行ずつ分けて取得できています。

[aws logs get-log-events]コマンドには、開始時間/終了時間の指定、文言による指定をする方法(オプション)が用意されていますので、それらを使ってフィルタリングをすると使いやすくなると思います。

以上になります。


==========
AWSの Lambdaではログが CloudWatch Logsに格納されているということを知り、それを CLIで取得できることをお勉強しました。

何となくですがこの感じだと Grafanaあたりで取得できそうな気がします。
そうしたらカッコイイ画面でログ確認をできるかも知れません。