サンプルクエリ
このセクションでは、CloudWatch コンソール
一般的なクエリ
最近追加された 25 件のログイベントを検索します。
fields @timestamp, @message | sort @timestamp desc | limit 25
1 時間あたりの例外の数のリストを取得します。
filter @message like /Exception/ | stats count(*) as exceptionCount by bin(1h) | sort exceptionCount desc
例外ではないログイベントのリストを取得します。
fields @message | filter @message not like /Exception/
Lambda ログのクエリ
過剰にプロビジョニングされたメモリの量を確認します。
filter @type = "REPORT" | stats max(@memorySize / 1000 / 1000) as provisonedMemoryMB, min(@maxMemoryUsed / 1000 / 1000) as smallestMemoryRequestMB, avg(@maxMemoryUsed / 1000 / 1000) as avgMemoryUsedMB, max(@maxMemoryUsed / 1000 / 1000) as maxMemoryUsedMB, provisonedMemoryMB - maxMemoryUsedMB as overProvisionedMB
レイテンシーレポートを作成します。
filter @type = "REPORT" | stats avg(@duration), max(@duration), min(@duration) by bin(5m)
Amazon VPC フローログのクエリ
ホスト間での上位 15 件のパケット転送を確認する:
stats sum(packets) as packetsTransferred by srcAddr, dstAddr | sort packetsTransferred desc | limit 15
特定のサブネットにおけるホストの上位 15 バイトの転送を検出します。
filter isIpv4InSubnet(srcAddr, "192.0.2.0/24") | stats sum(bytes) as bytesTransferred by dstAddr | sort bytesTransferred desc | limit 15
データ転送プロトコルとして UDP を使用する IP アドレスを確認します。
filter protocol=17 | stats count(*) by srcAddr
キャプチャウィンドウでフローレコードがスキップされた IP アドレスを確認します。
filter logStatus="SKIPDATA" | stats count(*) by bin(1h) as t | sort t
Route 53 ログのクエリ
クエリタイプ別に 1 時間あたりのレコードのディストリビューションを確認します。
stats count(*) by queryType, bin(1h)
リクエスト数が最大である 10 件の DNS リゾルバーを確認します。
stats count(*) as numRequests by resolverIp | sort numRequests desc | limit 10
サーバーが DNS リクエストを完了できなかったレコード数をドメイン別およびサブドメイン別に確認します。
filter responseCode="SERVFAIL" | stats count(*) by queryName
CloudTrail ログのクエリ
サービス別、イベントタイプ別、および AWS リージョン別のログエントリ数を確認します。
stats count(*) by eventSource, eventName, awsRegion
AWS リージョン別の開始または停止された Amazon EC2 ホストを確認します。
filter (eventName="StartInstances" or eventName="StopInstances") and awsRegion="us-east-2"
新しく作成した IAM ユーザーの AWS リージョン、ユーザー名、および ARN を確認します。
filter eventName="CreateUser" | fields awsRegion, requestParameters.userName, responseElements.user.arn
API UpdateTrail
の呼び出し中に例外が発生したレコードの数を確認します。
filter eventName="UpdateTrail" and ispresent(errorCode) | stats count(*) by errorCode, errorMessage
TLS 1.0 または 1.1 が使用されたログエントリを検索する
filter tlsDetails.tlsVersion in [ "TLSv1", "TLSv1.1" ] | stats count(*) as numOutdatedTlsCalls by userIdentity.accountId, recipientAccountId, eventSource, eventName, awsRegion, tlsDetails.tlsVersion, tlsDetails.cipherSuite, userAgent | sort eventSource, eventName, awsRegion, tlsDetails.tlsVersion
TLS バージョン 1.0 または 1.1 を使用したサービスごとの呼び出し数を調べる
filter tlsDetails.tlsVersion in [ "TLSv1", "TLSv1.1" ] | stats count(*) as numOutdatedTlsCalls by eventSource | sort numOutdatedTlsCalls desc
NAT ゲートウェイに対するクエリ
AWS の請求が通常よりも高いことに気付いた場合、CloudWatch Logs Insights でその上位の要因を見つけることができます。次のクエリコマンドの詳細については、AWS プレミアムサポートのページで「VPC で NAT ゲートウェイを通過するトラフィックの上位の要因を見つけるにはどうすればよいですか?
NAT ゲートウェイ経由で最も多くのトラフィックを送信しているインスタンスを検索します。
次のクエリコマンドの「x.x.x.x」の部分をお使いの NAT ゲートウェイのプライベート IP に置き換え、「y.y」を VPC CIDR アドレス範囲の第 1 および 第 2 オクテットの値に置き換えます。
filter (dstAddr like 'x.x.x.x' and srcAddr like 'y.y.') | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10
NAT ゲートウェイ内のインスタンスとの間で送受信されているトラフィックを特定します。
filter (dstAddr like 'x.x.x.x' and srcAddr like 'y.y.') or (srcAddr like 'xxx.xx.xx.xx' and dstAddr like 'y.y.') | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10
VPC 内のインスタンスがアップロードとダウンロードの通信で最も頻繁に使用している、インターネット上の送信先を特定します。
アップロードの場合
filter (srcAddr like 'x.x.x.x' and dstAddr not like 'y.y.') | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10
ダウンロードの場合
filter (dstAddr like 'x.x.x.x' and srcAddr not like 'y.y.') | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10
Apache サーバーのログに対するクエリ
CloudWatch Logs Insights では Apache サーバーのログにクエリできます。次のクエリの詳細については、AWS クラウド運用と移行ブログの「Simplifying Apache server logs with CloudWatch Logs Insights
アクセスログを確認できるように最も関連性の高いフィールドを見つけ、アプリケーションの /admin パスでトラフィックを確認します。
fields @timestamp, remoteIP, request, status, filename| sort @timestamp desc | filter filename="/var/www/html/admin" | limit 20
メインページにアクセスした際のステータスコードが「200」(成功) になっている箇所を探し、一意の GET リクエストの数を見つけます。
fields @timestamp, remoteIP, method, status | filter status="200" and referrer= http://34.250.27.141/ and method= "GET" | stats count_distinct(remoteIP) as UniqueVisits | limit 10
Apache サービスが再起動した回数を確認します。
fields @timestamp, function, process, message | filter message like "resuming normal operations" | sort @timestamp desc | limit 20
解析コマンドの例
glob 式を使用して、ログフィールド @message
から、エフェメラルフィールド @user
、@method
、@latency
を抽出し、@method
と @user
の一意な組み合わせごとに平均レイテンシーを返します。
parse @message "user=*, method:*, latency := *" as @user, @method, @latency | stats avg(@latency) by @method, @user
正規表現を使用して、ログフィールド @message
から、エフェメラルフィールド @user2
、@method2
、@latency2
を抽出し、@method2
と @user2
の一意な組み合わせごとに平均レイテンシーを返します。
parse @message /user=(?<user2>.*?), method:(?<method2>.*?), latency := (?<latency2>.*?)/ | stats avg(latency2) by @method2, @user2
エフェメラルフィールドの loggingTime
、loggingType
、および loggingMessage
を抽出して、ERROR
文字列または INFO
文字列を含むログイベントをフィルタリングし、ERROR
文字列を含むイベントの loggingMessage
フィールドと loggingType
フィールドのみを表示します。
FIELDS @message | PARSE @message "* [*] *" as loggingTime, loggingType, loggingMessage | FILTER loggingType IN ["ERROR", "INFO"] | DISPLAY loggingMessage, loggingType = "ERROR" as isError