【Lightsail】LightsailのログをAWS CloudWatchに転送する

Amazon Lightsail

前回、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



手順

手順は以下の通り。


  1. CloudWatchAgentServerPolicyを割り当てたIAMユーザを作成
  2. CloudWatchAgentをインストール
  3. IAM情報を設定
  4. CloudWatchAgentの構成ファイルを編集
  5. CloudWatchAgentの設定ファイルを作成
  6. 設定の読み込み

ポイントは「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 はコメントアウトしなくてOK



5. 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!');


こんな感じで転送されることが確認できました。遅延は数秒ってところ。





まとめ

一度設定したらあとは放置するものなので、これで十分かなと思います。環境に合わせて config.json を設定していけば、かなり柔軟な運用が出来そうですね。