EC2 のシステム/アプリログを CloudWatch Logs に出力する方法

Blog-Thumbnail_WordPress-01

はじめに

本記事の概要

本記事では、Amazon EC2 インスタンスと Amazon CloudWatch Logs の統合方法について詳しく解説します。

  • EC2:
    • Elastic Compute Cloud
    • 安全でスケーラブルなコンピューティング能力をクラウド上で提供するサービス
  • CloudWatch:
    • AWS やオンプレミスのリソースとアプリケーションを監視するためのサービス

これらを統合することで、EC2 インスタンスからのログをリアルタイムで取得し、保存、分析することが可能となります。

本記事の想定読者

本記事は、「これから CloudWatch Logs と EC2 の統合を行おう」としている方向けです。
概ね以下のような方が、これらの統合を検討されているかと思います。

  • 調査の度にサーバログインしたくない人
    • 例1. 本番サーバの運用の都合
    • 例2. 運用チームの権限の都合
  • サーバ内のログを外部へ退避したい人
    • 例1. AutoScaling によってインスタンスが削除されてしまう
    • 例2. ログファイル肥大化によって EBS が圧迫されてしまう
  • 複数サーバのログを一元管理したい人

等が挙げられるかと思います。

では、公式ドキュメントを基に、具体的な手順や設定箇所をおさらいしましょう。

CloudWatch Logs とは

Amazon CloudWatch Logsは、AWSが提供する監視サービスの一部です。
具体的には以下のような機能を含みます。

  • アプリケーション、システム、カスタムログファイルのモニタリングと保管
  • ログデータをリアルタイムにモニタリング
  • 特定のフレーズや値のパターンを検索
  • 特定の時間範囲内のログイベントを表示
  • ログの保持 (retention) 期間の設定
  • メトリクス・アラームの連携

また、EC2 や Lambda、Route 53 などのAWSサービスから直接ログデータを送信することが可能です。
その他、オンプレミス環境からログデータを送信可能なエージェントも提供しています。
これによって、CloudWatch LogsはAWS内外問わず、あらゆる環境のログ管理に適しています。

次のセクションでは、CloudWatch Logs と EC2 を統合する方法を確認しましょう。

AWS の公式ガイドを参照

AWS 公式ドキュメントは、常にアップデートされています。
そのため、何か更新が無いか常にチェックすることをお勧めします。
EC2 Linux インスタンスに CloudWatch Logs Agent をインストールし設定する手順については、「クイックスタート: 実行中の EC2 Linux インスタンスに CloudWatch Logs エージェントをインストールして設定する」というガイドが提供されています。

クイックスタート: 実行中の EC2 Linux インスタンスに CloudWatch Logs エージェントをインストールして設定する - Amazon CloudWatch Logs
既存の EC2 インスタンスに CloudWatch Logs エージェントをインストールして設定します。

ステップ 1: CloudWatch Logs で使用する IAM ロールまたはユーザーを設定する

CloudWatch Logs エージェントは、IAM ロールとユーザーをサポートします。インスタンスに関連付けられた IAM ロールがすでに存在する場合、その下に IAM ポリシーが含まれていることを確認してください。インスタンスに関連付けられた IAM ロールがまだ存在しない場合は、次のステップで IAM 認証情報を使用するか、IAM ロールインスタンスに割り当てることができます。詳細については、「インスタンスへの IAM ロールのアタッチ」を参照してください。

ステップ 2: 既存の Amazon EC2 インスタンスに CloudWatch Logs をインストールして設定する

CloudWatch Logs エージェントのインストール手順は、Amazon EC2 インスタンスが Amazon Linux、Ubuntu、CentOS、Red Hat のどれを実行しているかによって異なります。インスタンスの Linux のバージョンに適切な手順を使用してください。

クイックスタート: 実行中の EC2 Linux インスタンスに CloudWatch Logs エージェントをインストールして設定する

次の章では実際にインストール・設定をしていきましょう。

CloudWatch Logs Agent に関する注意点

インストール・設定する前に注意です。

重要
古いログエージェントは廃止する予定です。CloudWatch には、EC2 インスタンスとオンプレミスサーバーからログとメトリックスの両方を収集できる統合エージェントが含まれています。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.html

先ほどの公式ドキュメントでは上記の記載がありました。
そう、CloudWatch Logs Agent は古いエージェントで廃止予定です

そのため、特別な理由がない限りは新しいエージェントを使用しましょう。
新しいエージェントのインストール・設定・移行方法は、以下の記事で解説しています。

https://blog.kuds.win/aws/cloudwatch-metrics-ec2-memory-swap/
【EC2】メモリ使用率・スワップ使用率を CloudWatch で表示する

そのため、どうしても古いエージェントを使いたい方だけ以下をご覧ください

IAM ロールの作成

IAM は、AWSサービスとリソースへのアクセスを安全に管理するためのサービスです。
※IAM: Identity and Access Management

このサービスを使用することで、必要なリソースに対する適切なアクセス権限を持つ IAM ロールを作成し、それを EC2 インスタンスに関連付けることが可能になります。

IAM ポリシー: AWSOpsWorksCloudWatchLogs

今回は、EC2 インスタンスから CloudWatch Logs にログを送信します。
これには、インスタンスが CloudWatch Logs への書き込みアクセス権を持つことが必要です。
ここで IAM ポリシー「AWSOpsWorksCloudWatchLogs」が役立ちます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ]
        }
    ]
}

このポリシーは CloudWatch Logs への適切なパーミッションを持ちます。

  • logs:CreateLogGroup : ロググループを作成する権限
  • logs:CreateLogStream : ログストリームを作成する権限
  • logs:PutLogEvents : ログイベントを送信する権限
  • logs:DescribeLogStreams : ログストリームの一覧を取得する権限

これをEC2インスタンスに関連付けることで、インスタンスからCloudWatch Logsへのログの書き込みを可能にします。

IAM ロールの作成手順

  1. AWS マネジメントコンソールにサインインし、IAM ダッシュボードを開く
  2. ナビゲーションペインで「ロール」を選択し、「ロールを作成」をクリック
  3. 「AWSサービス」、「EC2」選択し、「次のステップ: パーミッション」をクリック
  4. ポリシー名で「AWSOpsWorksCloudWatchLogs」を検索
  5. チェックボックスをオンにし、「次のステップ: タグ」をクリック
  6. (任意)タグを追加します。その後、「次のステップ: 確認」をクリック
  7. 適当なロール名を入力し、「ロールの作成」をクリック

作成が完了したら、インスタンスにアタッチしておきましょう。

awslogsd のインストールと設定

CloudWatch Logs へのログの送信を行うためには、EC2 インスタンス上に CloudWatch Logs エージェントが必要となります。
awslogsd は、この CloudWatch Logs エージェントの一部です。
ログデータを収集して CloudWatch Logs に送信する役割を果たします。

awslogsd のインストール手順

まず、awslogsd をインストールするには、以下のコマンドをEC2インスタンス上で実行します。

sudo yum install -y awslogs

なお、今回は Amazon Linux 2 を想定しています。
他の Linux ディストリビューションを使用している場合は、適切なパッケージ管理コマンドを使用してください。

awslogsd の設定

次に、awslogsd の動作を制御するには、設定ファイルを編集します。

/etc/awslogs/awscli.conf

まず、/etc/awslogs/awscli.conf ファイルは、awslogs エージェントが CloudWatch Logs サービスと通信する際の設定を制御します。
このファイルでは、特に注意すべきは、default セクションにある region 項目です。
ここでは、awslogs エージェントがデータを送信する CloudWatch Logs のリージョンを指定します。
例えば、東京リージョンに送信する場合は、次のように設定します。

[default]
region = ap-northeast-1

/etc/awslogs/awslogs.conf

次に、/etc/awslogs/awslogs.conf ファイルは、awslogs エージェントがどのログファイルを監視し、どのようにそのログデータを送信するかを制御します。
例えば、/var/log/messages を送信する設定を以下に示します。

[/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/messages を指定しています。
そして、送信先のロググループ名として /var/log/messages を指定しています。

また、必要に応じて、/var/log/httpd/error_log 等も追加します。

awslogsd の起動と自動起動有効化

awslogsd を起動し、システムの起動時に自動的に起動するように設定します。
例えば、Amazon Linux 2 では以下のコマンドを使用します。

sudo systemctl start awslogsd
sudo systemctl enable awslogsd

これによって、EC2 インスタンスが再起動した後も awslogsd が自動的に起動し、ログデータの収集と送信を続けます。

以上で、CloudWatchLogs にログが出力されるはずです。

CloudWatch のコストと削減策

AWS CloudWatch は非常に便利なサービスです。
しかし、大量のログデータを取り扱う場合、そのコストが意外と高くなることがあります。
ここでは、CloudWatch の一般的なコストとその削減策について解説します。

CloudWatch のコスト

まず、AWS CloudWatchの料金は主に次の3つの部分からなります。

  1. ログデータの収集と保存
    • ログデータが CloudWatch Logs に送信されたとき、そしてそのデータが保存されている間に料金が発生
    • 最初の 5GB / 月 は無料で、それ以上は GB 単位で課金
  2. ログデータの分析
    • CloudWatch Logs Insights を使用してログデータをクエリする場合、実行したクエリのバイト数に応じて料金が発生
  3. アラームの作成
    • CloudWatchアラームを使用して特定の条件を監視する場合、作成したアラームの数に応じて料金が発生

なお、無料/有料利用枠に関するより詳細な情報は、公式ドキュメントをご参照ください。

Amazon CloudWatch Pricing – Amazon Web Services (AWS)

CloudWatch の削減策

システムログやアプリケーションログは大量に生成される可能性があります。
そのため、場合によってはストレージ料金が高額になります。
コストを削減する方法としては、以下のようなものがあります。

  • 不要なログデータのフィルタリング:
    • CloudWatch Logsエージェントでは、送信するログデータをフィルタリング
    • 不要なログデータをフィルタリングすることで、取り込み量を削減可能
  • ログデータの保管期間を短くする:
    • CloudWatch Logsでは、データの保管 (retention) 期間を設定可能
    • データの保管期間を短くすることで、保管料金を削減可能
  • ログデータの圧縮:
    • awslogs エージェントは GZIP 圧縮に対応
    • 設定を有効にすることでデータの取り込み量を削減可能

以上のような手段で CloudWatch のコストを削減することが可能です。
ただし、どの手段を選択するかは、システムの要件や運用の都合に依ります。

さいごに

本記事では、AWS CloudWatch Logs を使用して、AWS EC2 インスタンスのシステムログ出力する方法について詳しく説明しました。

途中、「注意」として記載しましたが、 CloudWatch Logs Agent は古いエージェントで廃止予定です
そのため、特別な理由がない限り、新しいエージェントの CloudWatch Agent を利用することを検討してください。
CloudWatch Agent のインストール・設定・移行方法については以下の記事をご覧ください。

https://blog.kuds.win/aws/cloudwatch-metrics-ec2-memory-swap/
【EC2】メモリ使用率・スワップ使用率を CloudWatch で表示する

コメント