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ポリシーを作ります。

  1. 「IAM」へ
  2. 「ポリシー」へ
  3. 「ポリシーの作成」へ
  4. タブの「JSON」へ
  5. 以下、JSONポリシードキュメントを貼り付けて「ポリシーの確認」をクリック
  6. 「ポリシーの確認」で名前「Send_to_CloudWatch_Logs」などの名前を入力
  7. 説明に「Send to CloudWatch Logs」などを入力
  8. 「ポリシーの作成」をクリック
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
    ],
      "Resource": [
        "arn:aws:logs:*:*:*"
    ]
  }
 ]
}

※このポリシーには、メモリとディスクは含まれていないのでご注意ください。

EC2インスタンスにアタッチするIAMロールを作成

  1. IAMへ
  2. ロールへ
  3. ロールの作成へ
  4. 信頼されたエンティティの種類で「AWSサービス」を選ぶ
  5. ユースケースの選択で「EC2」を選ぶ
  6. 「次のステップ:アクセス権限」をクリック
  7. ポリシーのフィルタに「Send_to_CloudWatch_Logs」を入力し、同ポリシーを選択する
  8. 「次のステップ:タグ」をクリック
  9. 任意でプロジェクト名などのタグを入力し、「次のステップ:確認」をクリック
  10. ロール名に「Send_to_CloudWatch_Logs_from_EC2」などを入力
  11. ロールの説明に「Send to CloudWatch Logs from EC2」などを入力
  12. 「ロールの作成」をクリック

EC2インスタンスにIAMロールをアタッチ

IAMロールはEC2インスタンス1台に1つしかアタッチ出来ませんのでご注意ください。EC2インスタンス向けのIAMロールは、EC2インスタンスの初回起動時に、役割を含まずにEC2インスタンス名-roleという感じで命名して、EC2起動時は、IAMポリシー無しでIAMロールを最初からアタッチしておくと便利だと思います。

  1. EC2へ
  2. インスタンスへ
  3. IAMロールをアタッチしたいインスタンスを選択
  4. アクション
  5. インスタンスの設定
  6. IAMロールの割り当て/置換
  7. Send_to_CloudWatch_Logs_from_EC2 を選ぶ
  8. 適用

awslogsのインストール/設定/起動

EC2インスタンスにSSH接続して以下コマンドでawslogsをインストール

sudo yum install awslogs

awslogsのリージョン設定 /etc/awslogs にて

sudo vi awscli.conf

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

以下の様にロググループを見ることが出来れば完成です

CloudWatchLogsGroup

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 エージェントをインストールして設定する を見ればわかるけど。公式ドキュメントは文章が冗長で、読む気が起きにくい・・・。

AWSの記事でコメントをいただくことがしばしばあるため、コメント機能を有効化しました。
ただ、申し訳ないのですが過去のコメントについては、WPの仕様で基本的に表示できません。
そのうち調べて表示します。お気軽にコメントください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください