CloudWatch LogsでLaravelのログを収集してみた

こんにちは、サーバーエンジニアの内田です。
複数のLaravelプロジェクトを開発しているとログの管理が大変になってきます。
そこで今回はログを一元管理することができるCloudWatch Logsを使ってLaravelのログを収集してみました。

目次

  1. CloudWatch Logsとは
  2. 前提
  3. IAMロールの作成
  4. CloudWatchエージェントのインストール
  5. CloudWatch エージェント設定ファイルの作成
  6. CloudWatch エージェントの起動
  7. 動作確認
  8. 最後に

CloudWatch Logsとは

AWSが提供するログ監視サービスです。
CloudWatch Logsを使うことでEC2インスタンスのアプリケーションログやシステムログの監視、保存ができます。

前提

  1. EC2インスタンス、Laravelプロジェクトは構築済みとします。
  2. 東京リージョンで構築します。

IAMロールの作成

EC2インスタンスに付与するIAMロールを作成していきます。

IAMロールの作成手順は下記のリンクを参考にしてください。 docs.aws.amazon.com

今回アタッチするポリシーは下記になります。

  • AmazonSSMManagedInstanceCore(後述のAWS Systems ManagerでCloudWatchエージェントをインストール、起動する際に必要)
  • CloudWatchAgentAdminPolicy(後述のSystems Manager パラメータストアに書き込むために必要)

EC2インスタンスに先ほど作成したIAMロールを割り当てます。
EC2の管理コンソールで「アクション」→「インスタンスの設定」→「IAM ロールの割り当て/置換」から割り当てることができます。

CloudWatchエージェントのインストール

コマンドラインからインストールすることもできますが、今回はAWS Systems Manager Run Commandを使用してCloudWatchエージェントをインストールします。
AWS Systems Manager Run Commandを使うとAWSの管理コンソールから指定したインスタンスに対してコマンドを実行できます。

  1. AWS Systems Managerのナビゲーションメニューから「Run Command」を選びます。

  2. コマンドドキュメントに [AWS-ConfigureAWSPackage] を選択します。 f:id:teco_uchida:20200519233729p:plain

  3. コマンドのパラメータは以下を選択します。

 Action:Install  
 Installation Type:Uninstall and reinstall  
 Name: AmazonCloudWatchAgent  

f:id:teco_uchida:20200519233805p:plain

4.[ターゲット]にはCloudWatchエージェントをインストールするEC2インスタンスを選択します。
f:id:teco_uchida:20200519234439p:plain

5.実行します。 f:id:teco_uchida:20200522000127p:plain

6.AWS Systems Manager Run Commandの「Run Command」からコマンド履歴を確認して、[AWS-ConfigureAWSPackage]のステータスが成功となっていればインストールできています。

CloudWatch エージェント設定ファイルの作成

エージェント設定ファイルウィザードのamazon-cloudwatch-agent-config-wizardコマンドで設定ファイルの作成します。
EC2にログインし、コマンドを実行すると質問されるので答えていきます。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================

Linux環境なので1を選択。

On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:
1

EC2なので1を選択。

Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1

CloudWatchエージェントはrootで動かすので1を選択。

Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1

今回は指定したディレクトリ配下のログを収集するので下記の質問は全て2を選択。

Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
2
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2

ここでLaravelのログのパス、ロググループ、ログストリーム名を指定します。
今回は下記のようにしました。
ログのパス/var/www/laravel/storage/logs/laravel*log
ロググループlaravel-logs
ログストリーム名instance ID(デフォルト)

Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
1
Log file path:
/var/www/laravel/storage/logs/laravel*log
Log group name:
default choice: [laravel*log]
laravel-logs
Log stream name:
default choice: [{instance_id}]

追加でログ収集しないので2を選択します。

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/www/laravel/storage/logs/laravel*log",
                                                "log_group_name": "laravel-logs",
                                                "log_stream_name": "{instance_id}"
                                        }
                                ]
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.

ここまでで設定ファイルは作成されますが、 Systems Manager パラメータストアで設定ファイルを管理するので1を指定します。

Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
1

パラメータストア名を設定します。
AmazonCloudWatch-で始まる名前にする必要があるので注意してください。
今回はAmazonCloudWatch-laravel-logsとしました。

What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]
AmazonCloudWatch-laravel-logs

リージョン、クレデンシャル情報はデフォルトを使用します。

Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]

Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXXXXXXXXXXXXX(From SDK)
2. Other
default choice: [1]:

Please make sure the creds you used have the right permissions configured for SSM access.
Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXXXXXXXXXXXXX(From SDK)
2. Other
default choice: [1]:

Successfully put config to parameter store AmazonCloudWatch-laravel-logs.
Program exits now.

設定ファイルが作成、Systems Manager Parameter Storeに保存されました。

CloudWatchエージェントの起動

CloudWatchエージェントのインストールで説明したAWS Systems Manager Run CommandでCloudWatchエージェントを起動します。

  1. AWS Systems Manager Run Commandのナビゲーションメニューから「Run Command」を選びます。

  2. [Command document] リストで、[AmazonCloudWatch-ManageAgent] を選択します。 f:id:teco_uchida:20200520010802p:plain

  3. コマンドのパラメータは以下を選択します。

Action: configure  
Mode: ec2  
Optional Configuration Source:ssm  
Optional Configuration Location:AmazonCloudWatch-laravel-logs(パラメータストア名を指定)  
Optional Restart: yes

f:id:teco_uchida:20200520011300p:plain

4.[ターゲット]でCloudWatchエージェントをインストールしたいEC2インスタンスを選択します。 f:id:teco_uchida:20200519234439p:plain

5.実行します。 f:id:teco_uchida:20200522000127p:plain

6.AWS Systems Manager Run Commandの「Run Command」からコマンド履歴を確認して、[AmazonCloudWatch-ManageAgent]のステータスが成功となっていれば起動できています。

動作確認

準備ができたのでログを出力してみましょう。
簡易的にですが下記のようなログを出力するコマンドを作成、3回実行しました。

\Log::debug('hello, world');
\Log::info('hello, world');
\Log::error('hello, world');

CloudWatch Logsの管理コンソールにアクセスすると、設定ファイル作成時に入力したロググループとinstanceIDのログストリームが作成されているので確認します。
f:id:teco_uchida:20200521014824p:plain ログが収集されていました。

最後に

今回はログを収集させるだけでしたが、収集したログをS3に保存させたり、エラーログをSlackに通知させることもできるようなのでもっと管理、監視を行いやすくしたいと思います。

Amazon Web Servicesおよびかかる資料で使用されるその他の AWS 商標 は、米国および/またはその他の諸国における、Amazon.com, Inc. またはその関連会社の商標です。

tecotec.co.jp