メモ > サーバ > サービス: AWS > CloudWatch Logs
■CloudWatch Logs
※ログファイルを転送して一元管理できる
Amazon CloudWatchとは:これからAWS監視を始める人へ
http://cloudtriage.terilogy.com/20150716/
Amazon CloudWatchの得意なこと苦手なこと:これからAWS監視を始める人へ その2
http://cloudtriage.terilogy.com/20150804-03/
Amazon CloudWatch Logsによるログの収集とフィルタとアラーム設定
http://dev.classmethod.jp/cloud/cloudwatch-logs/
CloudWatch Logsをさわってみた
http://qiita.com/mechamogera/items/a01c9d78d6b1842c4ded
CloudWatch LogsでAmazonLinux上のApacheエラーログを監視する
http://dev.classmethod.jp/cloud/cloudwatch-logs-apache/
ログファイルのモニタリング
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html
ログの保持期間の変更
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/SettingLogRetention.html
Zabbixを使えば柔軟な監視ができるが、ELBやRDSの監視は難しい(エージェントをインストールできないため)
CloudWatchとZabbixの併用がいいかも
■アクセスキーの発行
CloudWatchAgentServerPolicyの権限を持ったアクセスキーを発行する
もしくは、以下の手順のように「EC2にCloudWatchAgentServerPolicyの権限を持たせる」とすることで、アクセスキーの管理が不要になる
IAM → アクセス管理 → ロール → ロールを作成
信頼されたエンティティタイプ: AWSのサービス
一般的なユースケース: EC2
「次へ」ボタンをクリック
「許可を追加」画面で「CloudWatchAgentServerPolicy」を選択して「次へ」ボタンをクリック
ロール名: CloudWatchAgentServerRole
説明: Allows EC2 instances to call AWS services on your behalf. (変更せず)
「ロールを作成」ボタンをクリック
続いて、作成したIAMロールをEC2に紐づける
EC2 → インスタンス
対象のEC2にチェックを入れ、「アクション → セキュリティ → IAMロールを変更」を選択
「IAMロールを変更」画面になるので、上で作成した「CloudWatchAgentServerRole」を選択して「IAMロールの更新」ボタンをクリック
■awslogsをインストール&設定
# yum install -y awslogs … インストール
# vi /etc/awslogs/awscli.conf … 設定変更
Amazon Linux 2 以前の場合、以下で起動できる
[plugins]
cwlogs = cwlogs
[default]
#region = us-east-1
region = ap-northeast-1 … 東京リージョンに変更
aws_access_key_id = XXXXX … アクセスキーを発行した場合に設定(EC2に権限を持たせた場合は不要)
aws_secret_access_key = YYYYY
# vi /etc/awslogs/awslogs.conf … 監視対象を追加する場合
[/var/log/messages] … もとからある設定
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages
[/var/log/secure] … 認証に関するログ
datetime_format = %b %d %H:%M:%S
file = /var/log/secure
buffer_duration = 5000
log_stream_name = {instance_id}_secure
initial_position = start_of_file
log_group_name = /var/log/secure
[/var/log/audit/audit.log]
file = /var/log/audit/audit.log
buffer_duration = 5000
log_stream_name = {instance_id}_audit_log
initial_position = start_of_file
log_group_name = /var/log/audit/audit.log
[/var/log/httpd/access_log] … Apacheのアクセスログ
datetime_format = %d/%b/%Y:%H:%M:%S
file = /var/log/httpd/access_log*
buffer_duration = 5000
log_stream_name = {instance_id}_httpd_access_log
initial_position = start_of_file
log_group_name = /var/log/httpd/access_log
[/var/log/httpd/error_log] … Apacheのエラーログ
datetime_format = [%a %b %d %H:%M:%S %Y]
file = /var/log/httpd/error_log*
buffer_duration = 5000
log_stream_name = {instance_id}_httpd_error_log
initial_position = start_of_file
log_group_name = /var/log/httpd/error_log
[/var/log/maillog] … メールに関するログ
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/maillog*
buffer_duration = 5000
log_stream_name = {instance_id}_maillog
initial_position = start_of_file
log_group_name = /var/log/maillog
# systemctl start awslogsd … 起動
# systemctl enable awslogsd … awslogsの自動起動を設定
# systemctl status awslogsd … awslogsの実行状況を確認
# vi /var/log/awslogs.log … awslogsのログを確認
# service awslogs start
# chkconfig awslogs on
■転送されたログを確認
しばらく待つと、「CloudWatch → ロググループ」にログが表示される
■ログの長さ制限
32742 byte 以下ではそのまま表示され、32743 byte を閾値に TRUNCATED に置き換わるようなので注意
以下のようなメッセージが
production.ERROR: ShippingMappingDataService:createMappingHeaderData {"url":null,"ip":null,"agant":null,"userId":null,"error":"[object] (Illuminate\\Database\\QueryException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '20341540' for key 'PRIMARY' (SQL: insert into `deliveries` (`arrival_day`, `arrival_time_code`, 以下略
丸ごと以下のようなメッセージに置き換わる
「ログにこういう文字列が含まれていれば警告」のような仕組みに支障をきたすので、長いメッセージは、
「一定文字数ごとに改行して記録する」「ログ出力時に短くして記録する」「本来のログと並べて、短い版のログも記録する」
などの対応が必要そう
[TRUNCATED MESSAGE] 1231496 bytes are truncated.
ログをもとに何らかの通知を行う場合、念のため「[TRUNCATED MESSAGE] という文字があれば警告」としておくべきか
Amazon Web Services Japan によるスライドでも
「1 Log Event の最大サイズは 32KBです。 →32KBを超えると、ログがトランケートされてしまいます。」
という制限が紹介されている
CloudWatch Logsエージェントを検証してみた | mooapp
https://moomindani.wordpress.com/2014/07/16/cloudwatch-logs-5point-investigation/
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch Logs
https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-aws-cloudtrail-cloudwatch-logs
■ログの保存期間
デフォルトではログは無制限に保持される
必要に応じて、3ヶ月〜1年程度に設定しておくといい
ログ保存期間は、「CloudWatch → ロググループ」で、各ログの「保持」をクリックすることで変更できる
Amazon CloudWatch Logs とは - Amazon CloudWatch Logs
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html
Amazon CloudWatch Logsの保持期間を簡単に変更する方法 | DevelopersIO
https://dev.classmethod.jp/articles/how-to-easily-change-the-retention-period-of-amazon-cloudwatch-l...
CloudWatch Logs の保持期間を作成時に変更する | DevelopersIO
https://dev.classmethod.jp/articles/create-loggroup-change-retention/
ちなみにCloudWatchのグラフ表示は遡れるのが2週間までだったが、
かなり以前に15ヶ月に延長されている
[CloudWatch] メトリックの保持期間が14日→15ヶ月に延長されて、グラフ機能も強化されました | DevelopersIO
https://dev.classmethod.jp/articles/cloudwatch-extended-15months/
■利用料金
料金 - Amazon CloudWatch | AWS
https://aws.amazon.com/jp/cloudwatch/pricing/
【AWS】CloudWatchの料金体系を調べてみた - echo("備忘録");
https://makky12.hatenablog.com/entry/2022/11/21/120500
CloudWatch Logsの利用料金は以下のようになっている
また5GBの無料利用枠がある
収集 (データの取り込み) ... 0.76USD/GB
保存 (アーカイブ) ... 0.033USD/GB
分析 (Logs Insights のクエリ) ... スキャンしたデータ 1 GB あたり 0.0076USD
必要なログが1ヶ月あたり5GB以内なら、収集に関する課金は気にする必要が無さそう
保存に関しても、6ヶ月分保存するなら30GBほどのデータになるが、1ドル(0.033USD/GB × 30GB)程度で収まりそう
無料利用枠があるので、一般的なサイトなら無料もしくは微々たる金額で利用できそう