AWS CLIを使ってAWS Lambdaのログ取得時に注意したいこと

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーモン大好き、横山です。

今回AWS CLIでAWS Lambdaのログを見ようとした時に注意したいことを紹介します。

動作環境

awscliのバージョン

$ aws --version
aws-cli/1.10.13 Python/2.7.10 Darwin/15.3.0 botocore/1.4.4

AWS Lambdaのロググループ名

$ aws logs describe-log-groups --log-group-name-prefix "/aws/lambda/demo_func"
{
  "logGroups": [
    {
      "logGroupName": "/aws/lambda/demo_func",
      "creationTime": 1458178522834,
      "metricFilterCount": 0,
      "arn": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/demo_func:*",
      "storedBytes": 0
    }
  ]
}

ログストリーム名

$ aws logs describe-log-streams --log-group-name "/aws/lambda/demo_func"
{
  "logStreams": [
    {
      "logStreamName": "2016/03/17/[$LATEST]bab17ccf7d53463c83ff9490ab86bca8",
      "creationTime": 1458178522897,
      "firstEventTimestamp": 1458178523415,
      "lastEventTimestamp": 1458178523416,
      "lastIngestionTime": 1458178538472,
      "uploadSequenceToken": "49559729142106341411281184713470750416950415093793817186",
      "arn": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/demo_func:log-stream:2016/03/17/[$LATEST]bab17ccf7d53463c83ff9490ab86bca8",
      "storedBytes": 0
    }
  ]
}

嵌った事象

aws logs get-log-events にて、上記で確認した --log-stream-name を指定しているのに A client error (ResourceNotFoundException) occurred when calling the GetLogEvents operation: The specified log stream does not exist. と言われて取得出来ません。

$ aws logs get-log-events --log-group-name "/aws/lambda/demo_func" --log-stream-name "2016/03/17/[$LATEST]bab17ccf7d53463c83ff9490ab86bca8"

A client error (ResourceNotFoundException) occurred when calling the GetLogEvents operation: The specified log stream does not exist.

解決方法

--log-stream-name の引数を ' (シングルクォート) で囲みます。

$ aws logs get-log-events --log-group-name "/aws/lambda/demo_func" --log-stream-name '2016/03/17/[$LATEST]bab17ccf7d53463c83ff9490ab86bca8'
{
    "events": [
        {
            "timestamp": 1458178523415,
            "message": "Loading function\n",
            "ingestionTime": 1458178538472
        },
        {
            "timestamp": 1458178523416,
            "message": "START RequestId: 83c27942-xxxx-xxxx-xxxx-dbdce3a50da1 Version: $LATEST\n",
            "ingestionTime": 1458178538472
        },
        {
            "timestamp": 1458178523416,
            "message": "value1 = value1\n",
            "ingestionTime": 1458178538472
        },
        {
            "timestamp": 1458178523416,
            "message": "value2 = value2\n",
            "ingestionTime": 1458178538472
        },
        {
            "timestamp": 1458178523416,
            "message": "value3 = value3\n",
            "ingestionTime": 1458178538472
        },
        {
            "timestamp": 1458178523416,
            "message": "END RequestId: 83c27942-xxxx-xxxx-xxxx-dbdce3a50da1\n",
            "ingestionTime": 1458178538472
        },
        {
            "timestamp": 1458178523416,
            "message": "REPORT RequestId: 83c27942-xxxx-xxxx-xxxx-dbdce3a50da1\tDuration: 0.29 ms\tBilled Duration: 100 ms \tMemory Size: 128 MB\tMax Memory Used: 24 MB\t\n",
            "ingestionTime": 1458178538472
        }
    ],
    "nextForwardToken": "f/32518467704669835827145742534200547013545637961089351686",
    "nextBackwardToken": "b/32518467704647535081947211911059011295272989599583371264"
}

理由としては $LATEST がshellの変数として展開してしまい最終的に、 2016/03/17/[]bab17ccf7d53463c83ff9490ab86bca8 として --log-stream-name の引数として渡していたものと考えられます。

$ echo "2016/03/17/[$LATEST]bab17ccf7d53463c83ff9490ab86bca8"
2016/03/17/[]bab17ccf7d53463c83ff9490ab86bca8
$ echo '2016/03/17/[$LATEST]bab17ccf7d53463c83ff9490ab86bca8'
2016/03/17/[$LATEST]bab17ccf7d53463c83ff9490ab86bca8

まとめ

AWS CLIを使ってAWS Lambdaのログを取得するときの参考になれば幸いです。