Pleromaを動かしているLightsailからCloudWatch Logsにログ転送
Overview
前置き:Lightsailで動かしてるPleroma鯖が調子悪い
今回前置きがちょっと長い。興味がない人は読み飛ばしてくださいな。
LightsailのvCPU 1core, RAM 512MBで動かしていたPleromaですがどうも7/19辺りの設定変更以降調子が悪い。
私が特に使っていないタイミングで急にCPU使用率が上がり、そのままCPUクレジットを使い切り倒れているように見える。(Lightsailの中身はt2系のEC2インスタンス)
最初は一番安いインスタンスを使っていて、かつ設定ファイルを書き換えるたびにcompileが走るのでそのせいでCPUクレジットを多く消費した為止まっていると思っていたので一つ上のスペックに変更した。
しかし事象は改善されず。
おそらくfetch_initial_postsを有効にしたことで重くなったんじゃないかと思うけど、でも常時重くではなく日付変わる頃だけとかに発生しているのでなんかそれも違うような気がするんだよなぁ……。
という訳でとりあえずfetch_initial_postsを無効にして2日3日ほど様子を見ることに。
これで落ち着いたらまたfetch_initial_posts有効にして、また不定期にサーバが落ちる様になったら犯人は確定。
この辺の調査をしている間/var/logの中身をgrepで見たりとかやるの非常に面倒だったのでCloudWatch Logsの導入を決意。
Lightsailの制限
今回の主題とはずれますがLightsailの制限について。
Lightsailは安い代わりにEC2と比べて結構制限があり、例えばCloudWatchで直接メトリクスを見ることができなかったりします。
一応Lightsailのコンソール画面からCPU使用率やネットワークIOなど少しであれば見れますが、EC2と同様の量を見ることができません。
これが曲者で、特にCPUクレジット、IOクレジットが見られないというのが非常に苦しい。
カスタムメトリクスでロードアベレージなど見ることは可能ですが、クレジット2種はEC2特有のものなので見られません。
せめてこの2つだけでもCloudWatchから見られればいいんですがねー。
作業
EC2でCloudWatch Logsを使う場合はIAMロールを割り当てる場合が殆どだと思いますが、Lightsailはそうは行きません。
LightsailではEC2のように直接IAMロールを割り当てられないため、CloudWatchAgentをそのままの設定で使うとログを送ることができないのです。
ですのでLightsailインスタンスをオンプレミスサーバとして見立て、CloudWatchAgentを設定する必要があります。
環境はLightsail RAM 1GB, vCPU 1core, Ubuntu 18.04LTSです。
作業内容はこんな感じ
- CloudWatchAgentServerPolicyを割り当てたIAMユーザを作成
- CloudWatchAgentをインストール(https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)
- credentialファイルの作成
/opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
を編集- ウィザードを使いconfig.jsonを作成
- CloudWatchを開き、ログを取れているか確認
ユーザ作成は省略して、各種コマンドなんかを書いておきます。
CloudWatchAgentインストール
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
credential
awscli用のものに追記してます。
/home/<user-name>/.aws/credential
[AmazonCloudWatchAgent]
aws_access_key_id = <access-key>
aws_secret_access_key = <secret-key>
/opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
sudo vim /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
LightsailはデフォルトだとCloudWatchがEC2だと認識してしまい、ロールを使って認証しようとしてしまいます。
ですので、IAMユーザを使うように変更します。
コメントアウトを消し
[credentials]
shared_credential_profile = "AmazonCloudWatchAgent"
shared_credential_file = "/home/<user-name>/.aws/credentials"
CloudWatchAgent Config-Wizard
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
ここでメトリクスも取るように設定できますが今回はログのみ。
config.json
{
"agent": {
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/nginx/access.log",
"log_group_name": "pleroma-nginx",
"log_stream_name": "pleroma-nginx-access"
},
{
"file_path": "/var/log/nginx/error.log",
"log_group_name": "pleroma-nginx",
"log_stream_name": "pleroma-nginx-error"
},
{
"file_path": "/var/log/postgresql/postgresql-10-main.log",
"log_group_name": "pleroma-postgresql",
"log_stream_name": "pleroma-postgresql"
},
{
"file_path": "/var/log/syslog",
"log_group_name": "pleroma-syslog",
"log_stream_name": "pleroma-syslog"
}
]
}
}
}
}
設定の読み込み
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から確認
あとがき
今までのワンライナー修行が何だったのかという感じ。
ついでにMastodonのログ収集も設定しました。