dshimizu/blog/alpha

とりとめのないITブログ

Amazon Lightsail上のログ(Nginxのアクセスログ)をCloudWatch Logsへ送る設定

Amazon Lightsailで動かしているAmazon Linuxの中にあるログをCloudWatch Logsへ送りたい、と思って調べたらやれたのでメモしておく。

TL;DR

箇条書きでまとめると以下を行う必要がある。

  • Ligtsailで起動したOSへのCloudWatch Agentのインストール
  • CloudWatch Agentで使うIAMユーザの作成
  • CloudWatch Agentの設定

CloudWatch Agentのインストール

インストールの方法はいくつかあるが、公式ドキュメントの通りCLIでパッケージをインストールする。

$ sudo rpm -ihv https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm

CloudWatch Agentで使うIAMユーザの作成

Lightsail上のCloudWatch Agentで使うIAMユーザを作成して、IAMのAccess KeyとSecret Keyを作成する。 普通のEC2ならIAMロールを割り当てれば良いが、Lightsailでは使えないので、IAMのAccess KeyとSecret Keyも作成する必要がある

作成の仕方は以下にあるドキュメントの「CloudWatch エージェントをオンプレミスサーバーで実行するために必要な IAM ユーザーを作成するには」の通り。

CloudWatch Agentの設定

CloudWatch Agentの設定を行う。

common-config.tomlの設定

ドキュメントは下記にあるのでこれを参考にする。

まずは/opt/aws/amazon-cloudwatch-agent/etc/common-config.tomlcredentialsの項目を編集し、上記で作成したIAMユーザのAccess KeyとSecret KeyをCloudWatch Agentから使用できるようにしておく。

例えば以下のようにする。 credentialsファイルの場所やprofileは環境に合わせて変更すれば良い。 shared_credential_fileには上記で作成したIAMユーザのAccess KeyとSecret Keyを記載したファイルを設置しておく。

[credentials]
    shared_credential_profile = "default"
    shared_credential_file = "/opt/aws/.aws/credentials"

/opt/aws/amazon-cloudwatch-agent/etc/common-config.tomlはプロキシやアクセス権の設定をするためのもののようだった。

config.jsonの設定

/opt/aws/amazon-cloudwatch-agent/bin/config.jsonの設定ファイルを作成する。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizardというコマンドでインタラクティブに設定ファイルを作成することもできるが、ここではNginxのログを送るだけなので手動で設定する。

設定ファイルは以下のようになる。

{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "cwagent"
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
                        "log_group_name": "/aws/lightsail/amazon-cloudwatch-agent.log",
                        "log_stream_name": "{hostname}"
                    },
                    {
                        "file_path": "/var/log/nginx/ssl_access.log.ltsv",
                        "log_group_name": "/aws/lightsail/accesslog",
                        "log_stream_name": "{hostname}"
                    }
                ]
            }
        }
    }
}

設定ファイルを反映するために以下のコマンドを実行する。

$ 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 Logsへログが送られてくることを確認する。 ログが送られない場合は/var/log/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.logを確認すれば何か手がかりがあると思う。

まとめ

LightsailのNginxのアクセスログをCloudWatch Logsへ送るやり方を書いた。

オンプレミス(というかAWS以外の環境)で動いているOS等のログも同様のやり方で送ることができると思う。

参考