はじめに
数多くのLambdaを運用するシステムの場合、テスト時にCloudWatch Logsから特定のキーワードでログを検索して確認したいことがあります。
AWSコンソールでも検索はできますが、複数のログストリームにまたがる検索結果をコピーしたり、後で分析するためにファイルに保存したりするのは意外と手間がかかります。
そこで、PowerShellを使ってCloudWatch Logsから簡単にログを検索・取得し、テキストファイルに出力するツールを作成しました。
目次
必要なもの
環境
- PowerShell 5.1以降
- AWS PowerShellモジュール
インストール
|
1 |
Install-Module AWS.Tools.CloudWatchLogs |
AWS認証情報
以下のいずれかの方法で設定:
- AWS CLI:
aws configure - 環境変数:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY - IAMロール(EC2インスタンス上で実行する場合)
必要なIAM権限
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:FilterLogEvents", "logs:DescribeLogGroups" ], "Resource": "*" } ] } |
今回作成したコード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
param( [Parameter(Mandatory = $true)] [string]$LogGroupName, [Parameter(Mandatory = $true)] [string]$FilterPattern, [Parameter(Mandatory = $true)] [datetime]$StartTime, [Parameter(Mandatory = $true)] [datetime]$EndTime, [Parameter(Mandatory = $false)] [string]$OutputFile = "cloudwatch-logs.txt", [Parameter(Mandatory = $false)] [string]$Region = "ap-northeast-1" ) # パラメータの確認 Write-Host "=== 検索情報 ===" -ForegroundColor Yellow Write-Host "LogGroupName: '$LogGroupName'" -ForegroundColor Cyan Write-Host "FilterPattern: '$FilterPattern'" -ForegroundColor Cyan Write-Host "StartTime: '$StartTime'" -ForegroundColor Cyan Write-Host "EndTime: '$EndTime'" -ForegroundColor Cyan Write-Host "==================" -ForegroundColor Yellow # AWS PowerShell モジュールの確認 if (-not (Get-Module -ListAvailable -Name AWS.Tools.CloudWatchLogs)) { Write-Error "AWS.Tools.CloudWatchLogs モジュールがインストールされていません。" exit 1 } Import-Module AWS.Tools.CloudWatchLogs # 日時の妥当性チェック if ($StartTime -gt $EndTime) { Write-Error "開始日時が終了日時より後になっています。" exit 1 } # ローカル日時をUnix タイムスタンプに変換 $StartTimeUnix = [int64](($StartTime - (Get-Date "1970-01-01")).TotalMilliseconds) $EndTimeUnix = [int64](($EndTime - (Get-Date "1970-01-01")).TotalMilliseconds) try { # CloudWatch Logs からログを取得 $logs = Get-CWLFilteredLogEvent -LogGroupName $LogGroupName ` -FilterPattern $FilterPattern ` -StartTime $StartTimeUnix ` -EndTime $EndTimeUnix ` -Region $Region Write-Host "取得したログイベント数: $($logs.Events.Count)" -ForegroundColor Cyan if ($logs.Events.Count -eq 0) { Write-Host "指定された条件でログが見つかりませんでした。" -ForegroundColor Yellow return } # 検索条件をファイルの先頭に出力 $SearchConditions = @( "=== ログ検索条件 ===" "LogGroupName: '$LogGroupName'" "FilterPattern: '$FilterPattern'" "StartTime: '$StartTime'" "EndTime: '$EndTime'" "==================" "" ) # ログデータを作成(タイムスタンプ順にソート) $LogData = $logs.Events | Sort-Object Timestamp | ForEach-Object { $timestamp = [DateTimeOffset]::FromUnixTimeMilliseconds($_.Timestamp).ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffzzz") "$($_.LogStreamName)<code>t$timestamp</code>t$($_.Message)" } # 検索条件とログデータを結合して出力 ($SearchConditions + $LogData) | Out-File -FilePath $OutputFile -Encoding UTF8 Write-Host "出力ファイル: $(Resolve-Path $OutputFile)" -ForegroundColor Green } catch { Write-Host "エラー: $($_.Exception.Message)" -ForegroundColor Red throw } |
使い方
基本的な使い方
|
1 2 3 4 5 6 |
.\Get-CloudWatchLogs.ps1 ` -LogGroupName "/aws/lambda/my-function" ` -FilterPattern "ERROR" ` -StartTime "2025-01-15 00:00:00" ` -EndTime "2025-01-15 23:59:59" ` -OutputFile "error-logs.txt" |
実行例1: S3アップロード完了ログの取得
|
1 2 3 4 5 6 |
.\Get-CloudWatchLogs.ps1 ` -LogGroupName "/aws/lambda/my-function" ` -FilterPattern "S3にアップロードしました" ` -StartTime "2025-09-12 00:00:00" ` -EndTime "2025-09-12 23:59:59" ` -OutputFile "s3-upload-logs.txt" |
実行例2: エラーログの取得
|
1 2 3 4 5 6 |
.\Get-CloudWatchLogs.ps1 ` -LogGroupName "/aws/lambda/my-function" ` -FilterPattern "エラー" ` -StartTime "2025-01-15 09:00:00" ` -EndTime "2025-01-15 18:00:00" ` -OutputFile "error-logs.txt" |
パラメータを変数で指定する場合
|
1 2 3 4 5 6 7 8 9 10 |
$params = @{ LogGroupName = "/aws/lambda/my-function" FilterPattern = "処理完了" StartTime = "2025-01-15 00:00:00" EndTime = "2025-01-15 23:59:59" OutputFile = "completed-logs.txt" Region = "ap-northeast-1" } .\Get-CloudWatchLogs.ps1 @params |
ログの出力形式
出力ファイルはタブ区切り形式で以下のように出力されます:
|
1 2 3 4 5 6 7 8 9 10 |
=== ログ検索条件 === LogGroupName: '/aws/lambda/my-function' FilterPattern: 'S3にアップロードしました' StartTime: '2025-09-16 00:00:00' EndTime: '2025-09-16 23:59:59' ================== export-20250916 2025-09-16T15:01:10.292+09:00 ファイル C:\temp\file1.json を S3 にアップロードしました export-20250916 2025-09-16T15:45:37.424+09:00 ファイル C:\temp\file2.json を S3 にアップロードしました export-20250917 2025-09-17T10:01:13.571+09:00 ファイル C:\temp\file3.json を S3 にアップロードしました |
各行は以下の形式です:
- ログストリーム名(タブ)タイムスタンプ(タブ)メッセージ
タブ区切りなので、Excelで開いて分析することも簡単です。
フィルターパターンの活用
CloudWatch Logsのフィルターパターンを使うと、柔軟な検索が可能です:
| 用途 | フィルターパターン |
|---|---|
| 特定の文字列を含む | "エラーが発生しました" |
| 複数の条件(AND) | "エラー 処理" |
| 複数の条件(OR) | "?エラー ?警告" |
| 除外 | -"デバッグ" |
| 全ログ取得 | "" |
まとめ
このツールを使うことで、以下のメリットが得られました。
- 効率化: AWSコンソールでの手動検索・コピーが不要に
- 再現性: 同じ条件で何度でも検索可能
- 分析性: タブ区切り形式でExcelなどでの分析が容易
- 共有性: ファイルとして保存できるため、チーム内での共有が簡単
Lambda関数が多数ある環境でのログ取得確認作業が大幅に効率化されました。
同じような課題を抱えている方の参考になれば幸いです。
参考リンク
投稿者プロフィール
-
2023/1にスカイアーチネットワークスにJoin
AWSを日々勉強中







