こんにちは。最近AWSを学習し始めた者です。
最近CloudWatchを触れたのですが、
私みたいなインフラ自体あまり詳しくない人間にとっては"ログの監視"という文化から知る必要があり、いろんなサイトを回りながら学んだことをまとめます。
Apacheのログとは?
この説明がわかりやすかったです。
ブラウザでWebサイトにアクセスすると、サーバー上で稼働しているApacheがHTMLコンテンツをブラウザに返しますが、それと同時にアクセス記録を残します。
その記録が残されるファイルがログファイルです。この記録を調べることで、「本当にサーバーにHTTPアクセスがあったかどうか」「リクエストに対して正常に応答できているか」などの情報が分かります。
ログの見方
要するに
・誰が(どのIPアドレス)がアクセスしているのか
・変な奴が何百回もアクセスしてないか
・エラーなくちゃんと動いているか
などを調べるためにログを監視するということですね。
(もちろん他にもたくさんあるでしょうけど)
Apacheのログはいくつか種類があるようですが、今回は以下の2つを監視する設定をしたいと思います。
-
アクセスログ
いつ誰が何のページにアクセスしたのかを記録するログ -
エラーログ
リクエストの結果がエラーになったものだけが記録されるログ。
このログを見ると、サーバに問題が起きていないかを確認できる。
設定やリンクの間違いなどに気付けることもある。
ちなみにログ監視の設定が完了すると、
CloudWatchのコンソール画面からこんな感じでログの確認ができます。
↑これはアクセスログですが、アクセスログの見方はこのサイトがわかりやすかったです。
項目 | 説明 |
---|---|
リクエスト元IPアドレス | リクエストを送ったパソコンや携帯端末のIPアドレスが記録されます。 |
アクセスされた日時 | サーバーがリクエストを受け取り、HTMLコンテンツを返した日時になります。 |
アクセスされたファイル | サーバー上のどのファイルにアクセス要求があったかが分かります。 |
ステータスコード | 200の場合は「正常」です。これが404だったらNotFound、つまりファイルが見つからなかったというエラーになるし、500だったらInternalServerErrorになります。 |
UserAgent | アクセスしてきたデバイスの情報が分かります。OSやブラウザの種類、バージョンなどが書かれています。 |
CloudWatchの設定手順
環境
- パソコン:Mac
- AMI:Amazon Linux 2
前提
- Apacheのインストール、設定が完了していること。
- EC2にSSH接続済みであること。
構成図
めちゃくちゃシンプルな構成です。
Wordpressをインストールしており、そこにアクセスされたログを収集する設定をしていきます。
①awslogsをインストールする
CloudWatchにはCPUやメモリの使用率などを監視するリソース監視
はデフォルトで設定されていますが、
ログ監視の場合はawslogs
をインストールして自身で設定を追加する必要があります。
EC2にSSH接続している状態で、以下のコマンドでインストールします。
[ec2-user@ip-10-0-1-227 ~]$ sudo yum install awslogs
いろいろインストール画面が表示され最後にIs this ok [y/d/N]:
と表示されます。
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ awslogs.noarch 0:1.1.4-3.amzn2 を インストール
--> 依存性の処理をしています: aws-cli-plugin-cloudwatch-logs のパッケージ: awslogs-1.1.4-3.amzn2.noarch
--> トランザクションの確認を実行しています。
---> パッケージ aws-cli-plugin-cloudwatch-logs.noarch 0:1.4.6-1.amzn2.0.1 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
======================================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
======================================================================================================================================================
インストール中:
awslogs noarch 1.1.4-3.amzn2 amzn2-core 8.2 k
依存性関連でのインストールをします:
aws-cli-plugin-cloudwatch-logs noarch 1.4.6-1.amzn2.0.1 amzn2-core 62 k
トランザクションの要約
======================================================================================================================================================
インストール 1 パッケージ (+1 個の依存関係のパッケージ)
総ダウンロード容量: 70 k
インストール容量: 243 k
Is this ok [y/d/N]:
yキー
を押してインストールを進めます。
Downloading packages:
(1/2): aws-cli-plugin-cloudwatch-logs-1.4.6-1.amzn2.0.1.noarch.rpm | 62 kB 00:00:00
(2/2): awslogs-1.1.4-3.amzn2.noarch.rpm | 8.2 kB 00:00:00
------------------------------------------------------------------------------------------------------------------------------------------------------
合計 506 kB/s | 70 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : aws-cli-plugin-cloudwatch-logs-1.4.6-1.amzn2.0.1.noarch 1/2
インストール中 : awslogs-1.1.4-3.amzn2.noarch 2/2
検証中 : awslogs-1.1.4-3.amzn2.noarch 1/2
検証中 : aws-cli-plugin-cloudwatch-logs-1.4.6-1.amzn2.0.1.noarch 2/2
インストール:
awslogs.noarch 0:1.1.4-3.amzn2
依存性関連をインストールしました:
aws-cli-plugin-cloudwatch-logs.noarch 0:1.4.6-1.amzn2.0.1
完了しました!
[ec2-user@ip-10-0-1-227 ~]$
完了しました!
と表示されればインストール完了です。
②awslogsの設定をいじる
awslogs
ディレクトリまで移動します。
cd /etc/awslogs
このディレクトリには4つの設定ファイルがあります。
[ec2-user@ip-10-0-1-227 awslogs]$ ls -l
合計 20
-rw------- 1 root root 55 2月 3 07:25 awscli.conf
-rw-r--r-- 1 root root 8355 7月 25 2018 awslogs.conf
drwxr-xr-x 2 root root 6 7月 25 2018 config
-rw-r--r-- 1 root root 147 7月 25 2018 proxy.conf
まずawscli.conf
を編集します。
sudo vi awscli.conf
ログ転送先のリージョンがus-east-1
になっているので、現在のリージョンに書き換えます。
ここではap-northeast-1
に修正し、:wq
で上書き保存します。
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1 ←ここを修正
続いてawslogs.conf
を編集します。
sudo vi awslogs.conf
英語で長い説明が出てきます。
# ------------------------------------------
# CLOUDWATCH LOGS AGENT CONFIGURATION FILE
# ------------------------------------------
#
# --- DESCRIPTION ---
# This file is used by the CloudWatch Logs Agent to specify what log data to send to the service and how.
# You can modify this file at any time to add, remove or change configuration.
#
# NOTE: A running agent must be stopped and restarted for configuration changes to take effect.
#
# --- CLOUDWATCH LOGS DOCUMENTATION ---
# https://aws.amazon.com/documentation/cloudwatch/
#
# --- CLOUDWATCH LOGS CONSOLE ---
# https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logs:
#
# --- AGENT COMMANDS ---
# To check or change the running status of the CloudWatch Logs Agent, use the following:
#
# To check running status: service awslogs status
# To stop the agent: service awslogs stop
# To start the agent: service awslogs start
# To start the agent on server startup: chkconfig awslogs on
#
# --- AGENT LOG OUTPUT ---
# You can find logs for the agent in /var/log/awslogs.log
#
冒頭を翻訳するとこんな感じです。
--- DESCRIPTION --- ---.
このファイルはCloudWatch Logsエージェントがサービスに送信するログデータの種類や方法を指定するために使用します.
このファイルはいつでも変更可能で, 設定の追加,削除,変更を行うことができます.
DeepL
どうやらこのファイルで詳しいログの設定ができるようです。
では一番下までスクロールします。
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages
デフォルトで/var/log/messages
の設定が記述されています。
この設定についてはこのサイトの説明がわかりやすかったです。
UNIX系のOS(LinuxとかMacとか)で使われる、
あれやこれやのログが記録されているファイルです。
もう少しざっくり書くと 特定用途「以外」のログを記録するファイルになります。
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
この下にアクセスログ
とエラーログ
を取得するための設定を追加し:wq
で上書き保存します。
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages
[HttpAccessLog]
file = /var/log/httpd/access_log
log_group_name = HttpAccessLog
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S
[HttpErrorLog]
file = /var/log/httpd/error_log
log_group_name = HttpErrorLog
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S
key | value |
---|---|
file | どのファイル(ログ)を送るのかを指定するフィールド。今回はApacheのログを送りたいのでhttpd 配下のログファイルを指定している。 |
log_group_name | ログは特定の1箇所から送られるとは限らず、複数の場所から送られることもある。なので同じ種類のログはlog_group_name で指定して一纏めにすることができる。 |
log_streamname | ここはEC2インスタンスのIDを指定しているが、例えばEC2インスタンスが複数あり、それぞれから同じログを送信する場合、まずlog_group_name は同一で一纏めにすることができ、かつlog_streamname でログの送信元を判別できるようになる。 |
datetime_format | 送信時間の書き方ですね |
③IAMロールを作成する
EC2からCloudWatchにログを送信する権限を与えるためのIAMロールを作成します。
IAMロールとは:
ユーザーやグループではなく、EC2などのAWSのサービスや他のアカウントに対してにAWS の操作権限を付与するための仕組みです。
IAMのコンソールからロール
ロールの作成
をクリックします。
ポリシーは1から作る必要はなく、
AWSが用意しているCloudWatchAgentServerPolicy
を利用できます。
検索窓にCloudWatchAgentServerPolicy
と入力し、検索結果にチェックをつけて次のステップ
をクリックします。
ロールの名前と説明を求められます。
今回はポリシー名と同じにしてロールの作成
をクリックします。
④作成したIAMロールをEC2にアタッチする
EC2のコンソール画面から該当のEC2インスタンスを右クリックし、
セキュリティ
IAMロールを変更
をクリックします。
⑤awslogsを起動する
以下のコマンドでawslogsのデーモンを起動します。
sudo systemctl start awslogsd
EC2を再起動しても再度自動で起動できるように以下のコマンドも入力します。
これですべての準備は完了です。
sudo systemctl enable awslogsd
⑥ログを確認する
CloudWatchコンソールのロググループ
をクリックし、awslogs.conf
に追加したロググループが表示されていることを確認します。
試しにHttpAccessLog
をクリックするとログストリーム(今回はEC2インスタンスのIDを指定している)が表示されます。
このログストリームをクリックします。
最後に
とりあえずログの送信方法の学習でしたが、実務ではこのログをどう見るのかが求められてくるのでしょう。
それはまた必要になったタイミングで学びたいと思います。
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com