前回、Laravelのログ設定を変更してログをAWS CloudWatch(以下、CloudWatch)に転送する方法を書きました。
【Laravel】LaravelのログをAWS CloudWatchに転送する – NOBODY:PLACE
この方法だとLaravel側で転送するログを選別することが出来るので便利なんですが、考え方としてすべてのログをCloudWatchに転送して、選別はCloudWatch上で行うという考え方もアリです。OS上にCloudWatchのエージェントをインストールして、自動的に転送してもらうという考え方ですね。Laravelでやるのに比べてコンソール仕事が増えるので、慣れが必要ですが、結果的にはこっちの方がスッキリ設定できました。こっちの方がいいかも。
参考にさせて頂いた記事は次の2つです。
Pleromaを動かしているLightsailからCloudWatch Logsにログ転送 – blog.asterism.xyz
CloudWatch Agent のメトリクス(ログも)を別リージョンへ送ってみる | Developers.IO
手順
手順は以下の通り。- CloudWatchAgentServerPolicyを割り当てたIAMユーザを作成
- CloudWatchAgentをインストール
- IAM情報を設定
- CloudWatchAgentの構成ファイルを編集
- CloudWatchAgentの設定ファイルを作成
- 設定の読み込み
ポイントは「LightsailはEC2のようだけどEC2じゃないのでオンプレミスサーバだと想定して設定を行う」ということみたいです。EC2だったらyumでawslogsエージェントをインストールして連携みたいなこと出来るんですけど、それは出来ないんですね。なるほど。
1. CloudWatchAgentServerPolicyを割り当てたIAMユーザを作成
これは文字通りなのでそのまま実行。アクセスキーとシークレットキーが必要です。2. CloudWatchAgentをインストール
$ wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
$ sudo rpm -U ./amazon-cloudwatch-agent.rpm
最近yumとかcomposerとかでインストールすることが多いので、ダウンロードしてrpmでインストールとかとか久しぶりにやりました。
3. IAM情報を設定
$ sudo aws configure --profile AmazonCloudWatchAgent
指示にしたがってアクセスキーとシークレットキーを入力すると、credentialsファイルが生成されます。場所は
/root/.aws/credentials
にあります。続いて
/root/.aws/config
を編集してリージョンも設定。$ sudo vi /root/.aws/config
[profile AmazonCloudWatchAgent]
region = ap-northeast-1
4. CloudWatchAgentの構成ファイルを編集
$ vi /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
[credentials]
shared_credential_profile = "AmazonCloudWatchAgent"
# shared_credential_file = "{file_name}"
構成ファイルを編集して、3で作ったcredentialsファイルを利用するようにします。
shared_credential_file
はコメントアウトしなくてOK5. CloudWatchAgentの設定ファイルを作成
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
CloudWatchに転送するログの設定を行います。自分の環境ではなぜかAWS Parameter Storeへの設定が上手く行かなかったので、省きました。結果的に以下のような感じの
config.json
ファイルが、/opt/aws/amazon-cloudwatch-agent/bin/
ディレクトリに出来ていればOKです。{
"agent": {
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/[Laravelディレクトリ]/storage/logs/laravel-20**-**-**.log",
"log_group_name": "sample-group",
"log_stream_name": "sample-stream"
}
]
}
}
}
}
6. 設定の読み込み
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
設定ファイルを読み込んで起動します。実際にログを書き出してみて、CloudWatchで記録されていればOKです。
例えばこんな感じでログを書きだしてみると、
\Log::error('error message!');
\Log::debug('debug message!');
\Log::info('info message!');
\Log::warning('warning message!');
\Log::emergency('emergency message!');
こんな感じで転送されることが確認できました。遅延は数秒ってところ。