概要
AWS Lambdaのデバッグ方法をまとめる。
※この記事ではNode.jsの利用を想定。
コード上でログを出力する(基本)
以下のメソッドが利用出来る。
- console.log()
- console.error()
- console.warn()
- console.info()
出力されたログはLambdaコンソールの[Log output]に出力される。
console.log("🐱");
🐱が出ている事が確認出来るかと思う↓
このあたりは公式ドキュメントにも記載されている基本的な内容。
出力したログをCloudWatchで確認する
LambdaはCloudWatchにもログを書き込むようになっている。
console.logで出力したログはCloudWatchでも確認出来る。
CloudWatchの管理画面から、ログ → /aws/lambda/{lambda関数名}/{ログストリーム} とページ遷移していくとログが確認出来る。
/aws/lambda/{lambda関数名}という部分がCloudWatchのロググループ名となる。
私の場合「customAuthorize」という名前の関数を定義していたので、ロググループ名は「/aws/lambda/customAuthorize」となる。
ログストリームに関しては見た感じLambda関数の実行毎に作られるようだった。
ちなみに、この2つはLambdaのcontextオブジェクトの中に情報があるので以下のコードで取得出来る。
// ロググループ名
console.log(context.logGroupName);
// ログストリーム名
console.log(context.logStreamName);
それぞれ下記のように出力されていたので、ログ → /aws/lambda//aws/lambda/customAuthorize/2016/12/14/[$LATEST]26b5469427e449349dbda15096c88e0b にアクセスすれば該当リクエストのログを確認出来る。
- console.log(context.logGroupName)
- /aws/lambda/customAuthorize
- console.log(context.logStreamName)
- 2016/12/14/[$LATEST]26b5469427e449349dbda15096c88e0b
何度実行してもCloudWatchにログが出力されない場合
公式のトラブルシューティングにも記載されているが、Lambda関数の実行ロールでログデータをCloudWatch Logsに書き込むアクセス権限が付与されていない可能性がある。
※少なくもとポリシーが以下のように設定されている必要がある。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
おまけ(オブジェクトの中身の詳細を表示する)
エラー発生時のerrorオブジェクトの中身を詳細に見たい時はutil.inspect()を利用する。
※これはLambdaの話というよりは、Node.jsの話。
const util = require('util');
console.log("🐱" + util.inspect(error, false, null));
上記のようにログ出力するとCloudWatchのログ上に詳細な"error"の中身が表示される。