CloudWatch LogsとLogs Insights
EC2、Lambda、コンテナのログをロググループに集約し、CloudWatch Logs Insightsのクエリでエラーやパターンを見つけます。
「CloudWatch LogsとLogs Insights」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
CloudWatch Logs の概要
Amazon CloudWatch Logsは、AWS のサービスや独自のアプリケーションからログデータを収集、保存、分析する、フルマネージドのログ集約サービスです。サーバーに SSH 接続してファイルを読む従来のログ管理とは異なり、CloudWatch Logs はすべてのログを耐久性と暗号化を備えたストレージに一元化し、組み込みのクエリ、フィルタリング、メトリクス抽出、保持期間管理を提供します。EC2、Lambda、ECS、EKS、API Gateway、CloudTrail、VPC Flow Logs とネイティブに統合できます。
ロググループとログストリーム
ログは階層的に整理されます。ロググループは、同じ保持期間とアクセス制御の設定を共有するログの名前付きコンテナです(例:/aws/lambda/my-function)。ロググループ内では、各ログストリームが連続するログイベントの単一のソースを表します。これは 1 つの EC2 インスタンス、1 つの Lambda コンテナ、または 1 つの ECS タスクなどです。1 つのロググループに数千のストリームを含めることができますが、各ストリームが属するロググループは必ず 1 つだけです。
# Create a log group with 30-day retention
aws logs create-log-group \
--log-group-name /myapp/production/api
aws logs put-retention-policy \
--log-group-name /myapp/production/api \
--retention-in-days 30
# List log streams in a group
aws logs describe-log-streams \
--log-group-name /myapp/production/api \
--order-by LastEventTime \
--descendingLambda と EC2 からのログ送信
AWS Lambdaは、標準出力と標準エラー出力の内容をすべて CloudWatch Logs に自動的に送信します。Lambda 実行ロールに、logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEventsを含めるだけで済みます。EC2 インスタンスでは、CloudWatch Agentをインストールし、監視するログファイル(例:/var/log/nginx/access.log)、書き込み先のロググループ、個々のログエントリを識別するパターンを設定します。
# CloudWatch Agent config for tailing an application log file
# /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
# {
# "logs": {
# "logs_collected": {
# "files": {
# "collect_list": [{
# "file_path": "/var/log/myapp/app.log",
# "log_group_name": "/myapp/production/api",
# "log_stream_name": "{instance_id}",
# "timestamp_format": "%Y-%m-%dT%H:%M:%S"
# }]
# }
# }
# }
# }CloudWatch Logs Insights
CloudWatch Logs Insightsは、専用のクエリ言語を使用してログデータを検索・分析できるインタラクティブなクエリエンジンです。1 つ以上のロググループに対してクエリを実行し、時間範囲でフィルタリングし、構造化または非構造化されたログ行からフィールドを抽出し、データを集計し、結果を棒グラフや時系列として可視化できます。クエリはオンデマンドで実行され、スキャンしたデータ 1 GB あたりの料金が発生します。ログを JSON として構造化すると、スキャン量を大幅に削減できます。
# Find the top 10 slowest Lambda invocations in the last hour
aws logs start-query \
--log-group-name /aws/lambda/my-function \
--start-time $(date -d '1 hour ago' +%s) \
--end-time $(date +%s) \
--query-string 'filter @type = "REPORT"
| fields @requestId, @duration
| sort @duration desc
| limit 10'Logs Insights クエリ言語
Logs Insights クエリ言語では、パイプで区切ったコマンドを使用します。fieldsは表示するフィールドを選択し、filterはイベントを絞り込みます(likeと=~による正規表現をサポート)。statsはデータを集計し、sortは結果を並べ替え、limitは結果数の上限を設定します。サービスは JSON 形式のログ行に含まれるフィールドを自動的に検出します。非構造化ログでは、グロブまたは正規表現のパターンを指定したparseを使用して値を解析できます。
# Count errors by status code in the last 24 hours
fields @timestamp, @message
| filter @message like /ERROR/
| parse @message '* * * [*] "* *" * *' as host, user, datetime, request, method, status, bytes
| stats count(*) as errorCount by status
| sort errorCount desc
| limit 20メトリクスフィルター:ログからメトリクスへ
メトリクスフィルターは、受信するログイベントを継続的にスキャンしてパターンを検索し、一致するたびにカスタム CloudWatch メトリクスを増分します。たとえば、Lambda ロググループにメトリクスフィルターを作成し、ログ行にERRORが含まれるたびにErrorCountメトリクスを増分できます。その後、このメトリクスに CloudWatch アラームを作成してチームに通知します。これにより、結果を別のデータベースに保存することなく、ログを対応可能なメトリクスに変換できます。
# Create a metric filter that counts ERROR lines
aws logs put-metric-filter \
--log-group-name /myapp/production/api \
--filter-name ErrorCount \
--filter-pattern 'ERROR' \
--metric-transformations \
metricName=ApplicationErrors,metricNamespace=MyApp,metricValue=1,defaultValue=0
# Now create an alarm on the resulting metric
aws cloudwatch put-metric-alarm \
--alarm-name HighErrorRate \
--metric-name ApplicationErrors \
--namespace MyApp \
--statistic Sum \
--period 60 \
--evaluation-periods 1 \
--threshold 10 \
--comparison-operator GreaterThanThreshold \
--alarm-actions arn:aws:sns:us-east-1:111122223333:Opsログのサブスクリプションとストリーミング
サブスクリプションフィルターは、ログイベントをほぼリアルタイムで別のサービスにストリーミングし、処理または保存できるようにします。AWS Lambda(ログの変換とルーティング)、Amazon Kinesis Data Streams(大量のログ処理)、Amazon Kinesis Firehose(S3、OpenSearch、Splunk への配信)などにストリーミングできます。各ロググループでサブスクリプションフィルターを最大 2 つ使用できます。アカウント間でログをストリーミングするには、適切なリソースポリシーを持つ送信先が必要です。
# Stream all logs containing ERROR to a Kinesis Firehose for S3 archiving
aws logs put-subscription-filter \
--log-group-name /myapp/production/api \
--filter-name ErrorsToFirehose \
--filter-pattern 'ERROR' \
--destination-arn arn:aws:firehose:us-east-1:111122223333:deliverystream/LogArchive \
--distribution 'ByLogStreamName'保持ポリシーとコスト管理
デフォルトでは、CloudWatch Logs はデータを無期限に保存するため、コストが高くなる可能性があります。すべてのロググループに保持ポリシーを設定し、古いログイベントを自動的に削除してください。一般的な保持期間は、デバッグログで 7 日、アプリケーションログで 30 日、監査ログで 1~5 年です。create-export-task API を使用してロググループを S3 にエクスポートし、長期的かつ低コストでアーカイブすることもできます。ただし、エクスポートはバッチ処理であり、リアルタイムではありません。
# Set retention on all log groups that have no retention policy
aws logs describe-log-groups \
--query 'logGroups[?!retentionInDays].logGroupName' \
--output text | tr '\t' '\n' | while read lg; do
aws logs put-retention-policy \
--log-group-name "$lg" \
--retention-in-days 90
echo "Set 90-day retention on $lg"
doneVPC Flow Logs
VPC Flow Logsは、VPC、サブネット、または個々の ENI でネットワークインターフェイスとの間を流れる IP トラフィックのメタデータを記録します。ログは CloudWatch Logs または S3 に保存されます。フローログには、送信元 IP、宛先 IP、ポート、プロトコル、パケット数、バイト数、アクション(ACCEPT または REJECT)、タイムスタンプが含まれます。セキュリティグループと NACL のルールのトラブルシューティング、ポートスキャンの検知、トラフィックパターンの監査に非常に役立ちますが、実際のパケットペイロードは記録しません。
# Enable VPC Flow Logs to CloudWatch Logs
aws ec2 create-flow-logs \
--resource-ids vpc-0abc1234def567890 \
--resource-type VPC \
--traffic-type ALL \
--log-destination-type cloud-watch-logs \
--log-group-name /aws/vpc/flow-logs \
--deliver-logs-permission-arn arn:aws:iam::111122223333:role/FlowLogsRoleInsights による VPC Flow Logs のクエリ
CloudWatch Logs Insights は、特にVPC Flow Logs の分析に威力を発揮します。拒否されたトラフィックの特定、バイト数の多い通信元の検出、異常な接続の検知、特定のインスタンスへのトラフィックの分離をすばやく行えます。フローログの形式はデフォルトではスペース区切りですが、CloudWatch Logs に JSON 形式で発行すると、Insights クエリでフィールドが自動的に抽出されます。
# Find top 10 source IPs by rejected byte volume in the last day
fields srcAddr, dstAddr, dstPort, action, bytes
| filter action = 'REJECT'
| stats sum(bytes) as rejectedBytes by srcAddr
| sort rejectedBytes desc
| limit 10KMS によるログの暗号化
CloudWatch Logs は、デフォルトですべての保管中のデータをAWS マネージドキーを使用して暗号化します。特に規制対象の環境などでセキュリティを強化する場合は、カスタマーマネージド KMS キーをロググループに関連付けることができます。これにより、キーのローテーションとアクセスを制御でき、キーを無効化してすべてのログデータへのアクセスを取り消すこともできます。KMS キーには、CloudWatch Logs に暗号化と復号の使用を許可するキーポリシーが必要です。
# Associate a KMS key with a log group
aws logs associate-kms-key \
--log-group-name /myapp/production/api \
--kms-key-id arn:aws:kms:us-east-1:111122223333:key/KEY_ID
# Verify encryption is configured
aws logs describe-log-groups \
--log-group-name-prefix /myapp/production \
--query 'logGroups[].{Name:logGroupName,KmsKey:kmsKeyId}'クイックチェック
このレッスンで学んだ AWS Solutions Architect(SAA-C03)の概念について理解度を確認します。
レッスンのまとめ
このレッスンでは、ロググループとログストリームによってログをソース別に整理し、保持期間を設定できること、Logs Insightsによって強力なパイプベースのクエリ言語でログデータを検索・集計できること、そしてメトリクスフィルターによってログパターンを CloudWatch メトリクスに変換し、アラームをトリガーできることを学びました。次は、運用状況を可視化する CloudWatch Dashboards と Container Insights について説明します。
よくある質問
「CloudWatch LogsとLogs Insights」レッスンは無料ですか?
はい。「CloudWatch LogsとLogs Insights」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
「CloudWatch LogsとLogs Insights」で何を学びますか?
EC2、Lambda、コンテナのログをロググループに集約し、CloudWatch Logs Insightsのクエリでエラーやパターンを見つけます。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cloud & IT Cert Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「CloudWatch LogsとLogs Insights」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?
はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CloudWatchメトリクス、名前空間、ディメンション
- CloudWatchアラームと複合アラーム
- CloudWatch LogsとLogs Insights
- CloudWatchダッシュボードとContainer Insights