AwsPowerShellLambda?
2019-10-06
参照:https://docs.aws.amazon.com/powershell/latest/reference/Index.html
CloudWatchLogsの構造(基礎知識) †
AWSの各サービスの各インスタンスが出すログの塊が「ロググループ」として扱われている。
また各インスタンスが出す個別のログが「ログストリーム」として呼ばれている。
更に、そのログストリームが出す1行(1回の出力)が「ログイベント」として表されている。
例:Lambda関数"my-lambda-func"のログについて
- ロググループ "my-lambda-func"
- ログストリーム "yyyy/mm/dd/[$LATEST]0123456789abcdef0123456789abcd"
- ログイベント "処理開始"
- ログイベント "'Hello, World'"
- ログイベント "処理終了"
...
- ログストリーム "yyyy/mm/dd/[$LATEST]0123456789abcdef0123456789abce"
...
...
なので、あるインスタンスのある処理のログを見たい場合には、ロググループの他に実行時間から対象のログストリームを見つけだしてから、そのストリーム内のデータを参照する必要がある。
サンプル †
Lambda関数 oreno-lambda-func のログデータを取得する †
#sh(ruby){{
Import-Module -Name AWSPowerShell.NetCore
$group = @(Get-CWLLogGroup -LogGroupNamePrefix "/aws/lambda/oreno-lambda-func")[0];
$streams = Get-CWLLogStream -LogGroupName $group.LogGroupName -OrderBy ([Amazon.CloudWatchLogs.OrderBy]::LastEventTime) -Descending $true -Limit 10;
# 標準のソートキーはLastEventTimeかLogStreamNameしかないが
# 実際には「開始した時間(=CreationTimeやFirstEventTimestamp)」でソートし、直近開始したもののログを見たい、ということがほとんどだと思う
# その場合はPowerShellのソートを使うと良い
$streams = Get-CWLLogStream -LogGroupName $group.LogGroupName -NextToken $null;
while($AWSHistory.LastServiceResponse.NextToken -ne $null) {
$streams += @(Get-CWLLogStream -LogGroupName $group.LogGroupName -NextToken $AWSHistory.LastServiceResponse.NextToken)
}
$streams = $streams | Sort-Object -Descending -Property "CreationTime";
# 例えば、直近1件のログストリームの中身を確認する
$events = @();
$response = Get-CWLLogEvent -LogGroupName $group.LogGroupName -LogStreamName $streams[0].LogStreamName -NextToken $null;
$events += $response.Events;
while($AWSHistory.LastServiceResponse.NextToken -ne $null) {
$response = Get-CWLLogEvent -LogGroupName $group.LogGroupName -LogStreamName $streams[0].LogStreamName -NextToken $AWSHistory.LastServiceResponse.NextToken;
$events += $response.Events;
}
# "[時刻] メッセージ" の形式で出力
Write-Host -Object (@($events | Sort-Object -Property "IngestionTime" | % { "[{0}] {1}" -F $_.IngestionTime, $_.Message }) -join [Environment]::NewLine);
# リクエストが失敗(タイムアウト)したかチェック
$failed = @($events | ? { $_.Message.ToLower() -match 'requestid:\s+[a-z0-9\-]\s+process\s+exited\s+before\s+completing\s+request' }).Length -eq 0;
}}