BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】EC2インスタンスのログをCloudWatchに出力する(CloudWatchエージェントを導入する)方法[Linux編]

こんにちは!
BFT名古屋支店の、佐野です。

前回の記事にてお知らせした通り、今回はCloudWatchへのログ出力を題材とした記事の第二回目として
LinuxインスタンスのログをCloudWatchに出力する方法」
をお送りいたします。

また、その過程として(かつ今回の本題でもある)LinuxインスタンスにCloudWatchエージェントを導入する手順を解説いたします。


はじめに

少し迷いましたが、EC2インスタンスのログをCloudWatchに出力する流れについてはLinux編とWindows編に分けることといたしました。
LinuxWindowsとでは手順そのものやCloudWatchエージェントの導入時に問われる質問項目が異なるからです。
ただ大まかな流れは同じとなります。

また今回に関しては/var/log/messagesログを出力することをゴールとして解説していきます。
CloudWatchエージェントインストール時の途中に出力するログを追加できる選択肢がありますので、もし/var/log/messages以外のログを出力したい場合は別途その際に追加してください。


インスタンスへ割り当てるIAMロールの作成

まずインスタンスがCloudWatchにログを出力するには、インスタンス自体がCloudWatchにアクセスし、ログを書き込む権限が必要になります。
ですので最初にCloudWatchにログを書き込む為の権限を持つIAMロールを作成します。

まずAWSマネジメントコンソールからIAMを選択し、ロール項目の中にある「ロールの作成」を選択します。
そしてユースケースの選択から「EC2」を選択し、さらに「次のステップ:アクセス権限」を選択します。

f:id:bftnagoya:20201204185545p:plain

Attach アクセス権限ポリシーにて以下のポリシー2つを選択し、「次のステップ:タグ」を選択します。

  • CloudWatchAgentAdminPolicy
  • CloudWatchAgentServerPolicy

f:id:bftnagoya:20201204185549p:plain

タグの設定画面では任意のタグを入力(しなくてもOKです)し、「次のステップ:確認」を選択。
確認画面では任意のロール名とロールの説明を入力した後「ロールの作成」選択します。
(ロールの説明は必須項目ですが、デフォルトのままでもOKです)

作成後はAWSマネジメントコンソールに戻ってEC2を選択し、今回CloudWatchにログ出力させるインスタンスを選択後、以下の手順で作成したIAMロールをインスタンスにアタッチします。 (2020/12/4 現在)

  1. 「アクション」を選択
  2. 展開されたメニューから「セキュリティ」を選択
  3. さらに「IAMロールの変更」を選択
  4. 「IAMロール」で作成したIAMロールを選択して「保存」を選択

f:id:bftnagoya:20201204185557p:plain

f:id:bftnagoya:20201208114953p:plain

これでCloudWatchにログを書き込む権限をインスタンスに付与できたことになります。


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

権限の準備はIAMロールを付与することで整いましたので、次はCloudWatchエージェントをインストールします。
これについてはLinuxでもOSの違いがあり、Amazon LinuxAmazon Linux2の場合は以下のコマンドで簡単にインストールすることが可能です。

yum install -y awslogs

しかしOSがそれ以外の場合(RHELなど)は以上のコマンドは使用できず、一度CloudWatchエージェントパッケージをダウンロードする必要があります。
今回紹介する手順はwgetコマンドを使用するものになりますので、wgetをインストールしていない場合は以下のコマンドでインストールしてください。

yum install wget

wgetが使用できる状態となったら、以下のコマンドを実行してCloudWatchエージェントをダウンロードします。

wget https://s3.amazonaws.com/amazoncloudwatch-agent/redhat/amd64/latest/amazon-cloudwatch-agent.rpm

ダウンロードが完了したら、以下のコマンドを実行してCloudWatchエージェントをインストールします。

rpm -U ./amazon-cloudwatch-agent.rpm

インストールを行なった後、以下のコマンドを実行してCloudWatchエージェントの状態を確認してください。
ステータスが表示されれば、正常にインストールされています。(stoppedとなっているはずです)
また、これ以降の手順はどのLinux OSでも共通となります。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

以上でCloudWatchエージェントのインストールは完了になりますが、CloudWatchエージェントをインストールしただけではCloudWatchにログが出力されません。
この後に行なうCloudWatchエージェントの設定を行なったのち、ログが出力されるようになります。


CloudWatchエージェントの設定

今回はCloudWatchエージェント設定ファイルを作成するウィザードを使用します。
これを実行するとLinuxの場合は約17問の質問が提示され、それに回答を入力していく形で設定が進められます。
多くの場合はデフォルト設定で問題ありませんが、一部質問についてはデフォルトでない回答を選ぶ必要があります。

まずは以下のコマンドを実行して、ウィザードを起動させましょう。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

CloudWatchエージェントの設定ウィザードが起動したら、表示される質問に対し回答を行なっていきます。
その中で要注意となる質問は以下の通りです。

  • [7番目] CollectDからメトリクスを監視しますか?
Do you want to monitor metrics from CollectD?
1. yes
2. no

結構ハマるポイントであると思っている質問で、デフォルトでは1.yesとなっていますが、こちらは2.noを選択してください。
CollectDとはサーバの統計情報を収集するためのOSSであり、それを用いてメトリクスを取得するかどうかの質問なのですが、CollectDをインストールしていない状態でこれをyesにしてしまうとCloudWatchエージェントが起動する際にエラーを吐きます。
その場合CloudWatchエージェントは起動を完了できなくなりますので、メトリクスの取得やログの出力ができなくなってしまいます。
CollectDをインストールしていない、しない場合は、必ず2.noを選ぶようにしてください。

  • [12番目] デフォルトのメトリクス設定としてどのレベルが必要か?
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None

選択したものに応じてCloudWatchで取得できるメトリクス(数値項目)に違いがあります。
ログの取得のみを目的とするならばBasicあるいはNoneで問題ありませんが、もしメトリクスの取得にも重点を置いているならば吟味しましょう。
レベルによるメトリクスの取得項目は以下の通りです。

レベル メトリクス
Basic mem_used_percent
swap_used_percent
Standard cpu_usage_idle、cpu_usage_iowait、cpu_usage_user、cpu_usage_system
disk_used_percent、disk_inodes_free、diskio_io_time
mem_used_percent
swap_used_percent
Advanced cpu_usage_idle、cpu_usage_iowait、cpu_usage_user、cpu_usage_system
disk_used_percent、disk_inodes_free
diskio_io_time、diskio_write_bytes、diskio_read_bytes、diskio_writes、diskio_reads
mem_used_percent
netstat_tcp_established、netstat_tcp_time_wait
swap_used_percent
  • [15番目] ログファイルを監視しますか?
Do you want to monitor any log files?
1. yes
2. no

(1を選択すると以下のように表示)
Log file path:

(Log file pathを入力後)
Log group name:

(Log file pathを入力後)
Log stream name:

今回最も重要な箇所になります。ログファイルの取得を行なうか否かの質問です。
最初の問いにはもちろん1.yesで回答し、Log file pathについては、/var/log/messagesログを出力する場合は/var/log/messagesを入力します。
/var/log/messagesを取得せず、他のログを取得する場合は、そのログがLinux上で出力されているパスを入力してください。

またLog group nameはCloudWatch上のロググループの名称となります。
CloudWatchではロググループというくくりでログをまとめていますので、ログの保存先となるロググループ名をここで入力します。
特に指定はないので、デフォルトのまま、あるいは任意の名称を入力して問題ありません。
また任意の名前とする場合、取得先のホスト名を変数として使用できる以下の例がおすすめです。

{local_hostname}_messages

Log stream nameはロググループ内に作成されるログそのものの名称です。
こちらも特に指定はありませんので、デフォルトあるいは任意の名称を入力して問題ありませんが、インスタンスIDを表示できる以下の例がおすすめとなります。

{local_hostname}_{instance_id}
  • [16番目] 監視する追加のログファイルを指定しますか?
Do you want to specify any additional log files to monitor?
1. yes
2. no

15番目の質問で設定したログの他にも取得したいログがある場合は1.yes、そうでない場合は2.noを選択してください。
1.yesを選択した場合は15番目の質問同様、Log file path、Log group name、Log stream nameを聞かれることになります。
ここでCloudWatchにログを出力するログファイルを指定した後も、繰り返しこの質問が提示されますので、出力したい分のログファイルを全て追加した後、2.noを選択してください。

以上4項目が要注意とすべき質問となります。
全て回答をし終えると、そのままウィザードが終了します。

これでCloudWatchエージェントの設定ファイルが作成完了するのですが、場合によってはこの設定ファイルがうまく読まれないことがあります。
(筆者がRHELで行なった際、発生した問題です)
筆者はその問題解決の為に、作成された設定ファイルについて以下のコマンドを実行して/opt/aws/amazon-cloudwatch-agent/etc/にコピーしました。
その際はこれで解決しましたので、もし問題が起きた場合、あるいは備える場合はこちらを試してください。

cp /opt/aws/amazon-cloudwatch-agent/bin/config.json /opt/aws/amazon-cloudwatch-agent/etc/

以上でCloudWatchエージェント設定ファイルの作成は完了となります。


CloudWatchエージェントの起動

実際にCloudWatchエージェントを起動し、ログが取得できるかを確認します。
以下のコマンドを実行し、作成した設定ファイルをCloudWatchエージェントに反映し、CloudWatchエージェントを起動させます。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/config.json -s

さらに以下のコマンドを実行して、CloudWatchエージェントの“status”が“running”となっていることを確認します。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

CloudWatchエージェントが起動していることを確認したら、一度AWSマネジメントコンソールに戻り、CloudWatchを選択します。
そしてメニューからロググループを選択し、ロググループの一覧の中から先程設定したLog group nameと同じ名前のロググループを選択します。
その中に設定したLog stream nameの名前でログストリームが出力されていれば、CloudWatchへのログ出力が成功しています。

f:id:bftnagoya:20201204214958j:plain

f:id:bftnagoya:20201204215002j:plain


最後に

今回はLinuxにおけるCloudWatchエージェントの導入と、CloudWatchへのログ出力の方法を解説しましたが、Windowsにおいても大まかな流れは同じとなります。
また今回解説は行ないませんでしたが、プライベートサブネット上に存在するインスタンスでCloudWatchにログを出力したい場合、S3の場合などと同じくVPCエンドポイントの設定が必要となります。
機会があれば次回以降それについても軽く触れていきます。