AmazonLinux2のEC2インスタンスとCloudWatchの連携設定(非推奨awslogs)
awslogsは、はるか昔から既に非推奨になる予定(Amazon CloudWatch Logsユーザーガイド 2016年)らしいので統合CloudWatchエージェントamazon-cloudwatch-agentを使用することを強くお勧めします。
amazon-cloudwatch-agentのインストールとAmazonLinux2のログとメモリ・ディスク使用率のCloudWatch設定を参照ください。
AmazonLinux2のEC2インスタンスにCloudWatch Logs エージェントのawslogsをインストールして、EC2インスタンスとCloudWatchの連携を設定します。手順としては、EC2インスタンスからCloudWatch Logsにログを出力するためのIAMロールを作成し、そのIAMロールをEC2インスタンスにアタッチ。それからEC2インスタンスへCloudWatch Logsエージェントであるawslogsをインストールして、awslogsを設定、起動します。
IAMロールに設定するIAMポリシーを作成
IAMロールに設定する「CloudWatch Logsにログを送る事を許可」するIAMポリシーを作ります。
- 「IAM」へ
- 「ポリシー」へ
- 「ポリシーの作成」へ
- タブの「JSON」へ
- 以下、JSONポリシードキュメントを貼り付けて「ポリシーの確認」をクリック
- 「ポリシーの確認」で名前「Send_to_CloudWatch_Logs」などの名前を入力
- 説明に「Send to CloudWatch Logs」などを入力
- 「ポリシーの作成」をクリック
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
}
]
}
※このポリシーには、メモリとディスクは含まれていないのでご注意ください。
EC2インスタンスにアタッチするIAMロールを作成
- IAMへ
- ロールへ
- ロールの作成へ
- 信頼されたエンティティの種類で「AWSサービス」を選ぶ
- ユースケースの選択で「EC2」を選ぶ
- 「次のステップ:アクセス権限」をクリック
- ポリシーのフィルタに「Send_to_CloudWatch_Logs」を入力し、同ポリシーを選択する
- 「次のステップ:タグ」をクリック
- 任意でプロジェクト名などのタグを入力し、「次のステップ:確認」をクリック
- ロール名に「Send_to_CloudWatch_Logs_from_EC2」などを入力
- ロールの説明に「Send to CloudWatch Logs from EC2」などを入力
- 「ロールの作成」をクリック
EC2インスタンスにIAMロールをアタッチ
IAMロールはEC2インスタンス1台に1つしかアタッチ出来ませんのでご注意ください。EC2インスタンス向けのIAMロールは、EC2インスタンスの初回起動時に、役割を含まずにEC2インスタンス名-roleという感じで命名して、EC2起動時は、IAMポリシー無しでIAMロールを最初からアタッチしておくと便利だと思います。
- EC2へ
- インスタンスへ
- IAMロールをアタッチしたいインスタンスを選択
- アクション
- インスタンスの設定
- IAMロールの割り当て/置換
- Send_to_CloudWatch_Logs_from_EC2 を選ぶ
- 適用
awslogsのインストール/設定/起動
EC2インスタンスにSSH接続して以下コマンドでawslogsをインストール
sudo yum install awslogs
sudo vi awscli.conf
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1
awslogs.confでログファイルの各種設定 /etc/awslogs にて
sudo vi awslogs.conf
ここから下、記事が雑なので、徐々に書き直します。
以下は、awslogs.confに記載する中身です。Apache2.4、MySQL、supervisor、auditなどはログローテーションを含めて事前に設定しておく必要ありです。また、CloudWatch Logsの各種のロググループも事前に作成しておいてください(ロググループは、命名規則を最初に決めておかないとDangerカオスになります)。/var/log/messagesだけはAmazon Linux 2でそのまま使えるawslogs.confの設定例 awslogsでEC2のログをCloudWatch連携する方法を参考にしています。
[HttpdAccessLog]
datetime_format = %d/%b/%Y:%H/%M/%S
file = /path/to/access_log.*
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /HttpdAccessLog
[/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/mysqld.log]
datetime_format = %Y-%m-%dT%H:%M:%S%z
file = /var/log/mysqld.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/mysqld.log
[/var/log/supervisord.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/supervisord.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/supervisord.log
[/var/log/audit/audit.log]
file = /var/log/audit/audit.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/audit/audit.log
awslogs起動 ※Amazon Linux 2の場合
sudo systemctl start awslogsd
システムブートのたびにサービスを開始 ※Amazon Linux 2の場合
sudo systemctl enable awslogsd.service
以下の様にロググループを見ることが出来れば完成です
awslogs起動コマンドで下記エラーが出る場合
Redirecting to /bin/systemctl start awslogs.service
Failed to start awslogs.service: Unit not found.
とか
error reading information on service awslogs: No such file or directory
とか
のエラーが出て、CloudWatchコンソールで新しくロググループとログストリームが作られない場合、おそらくAmazon Linux 2じゃないAmazon Linux のawslogsコマンドを使ってます(Qiitaがこうなってしまっている)。Amazon Linux 2のawslogsコマンドを使ってください。
sudo service awslogs start
とか
sudo chkconfig awslogs on
は
Amazon Linux 2のawslogsコマンドではない!
30分ぐらい、悩み、時間を盗まれました。QiitaのawslogsでログをCloudWatchに連携する方法と同じようにやってエラー出るとか日本全国規模で爆死者続出する可能性がある。AWS公式ドキュメント クイックスタート: 実行中の EC2 Linux インスタンスに CloudWatch Logs エージェントをインストールして設定する を見ればわかるけど。公式ドキュメントは文章が冗長で、読む気が起きにくい・・・。