Amazon-CloudWatch

CloudWatch Logs Insights(集約編)


概要

こんにちは、テクニカルサポートの牛山です。

全2回に分けて、CloudWatch Logsへカスタムログを転送し、カスタムログを分析します。
今回は第1回目なので、CloudWatch Logsへカスタムログを転送(集約)するところまで実施します。

前提条件

  • ELB(ALB)を介してEC2台にアクセスが分散されていること。
  • EC2を2台以上作成していること。
  • EC2上にWEBコンテンツを設置し、WEBから観られる状態になっていること。
  • EC2上にアクセスログ、エラーログが吐かれていること。

AWS構成図

サーバへCloudWatchエージェントをインストール

[root@web01 ~]# yum install amazon-cloudwatch-agent

IAMロール作成およびインスタンスプロファイルに関連付け

以下、リンクを手順通りに、CloudWatchエージェント実行に必要なIAMロールを作成します。

※ CloudWatch エージェントで使用する IAM ロールとユーザーを作成する - Amazon CloudWatch

EC2 インスタンスで CloudWatch エージェントを実行するのに必要な IAM ロールを作成するには

以下で、AWS CloudShellを使用し、上記で作成したIAMロールをEC2インスタンスプロファイルに関連付けします。

※ 筆者費用節約のため、ムンバイリージョンで使用しています、リンクリージョンがムンバイになっているので適宜、読者のリージョンへ置換してください。
※ ap-south-1.console.aws.amazon.com/cloudshell/home?region=ap-south-1

EC2インスタンスID確認

[cloudshell-user@ip-10-0-165-114 ~]$ aws ec2 describe-instances

"Value": "web01"
"InstanceId": "i-0187ccb3f08c4c428"

"Value": "web02"
"InstanceId": "i-001d084399cc4f4c4"

事前にEC2インスタンスを2台作成しています。
※出力が長いため抜粋しております。

インスタンスプロファイル情報確認

[cloudshell-user@ip-10-0-165-114 ~]$ aws iam list-instance-profiles

"InstanceProfileName": "CloudWatchAgentServerRole"
"Arn": "arn:aws:iam::************:role/CloudWatchAgentServerRole"

先ほどマネージメントコンソール上から作成したIAMロールが出てくることを確認します。
※出力が長いため抜粋しております。

インスタンスプロファイルをEC2インスタンスにアタッチ(1)

関連付けるEC2インスタンスIDと先ほどのインスタンスプロファイル名を指定し設定します。
インスタンスIDは、本記事中「EC2インスタンスID確認」の箇所で確認できます。

[cloudshell-user@ip-10-0-165-114 ~]$ aws ec2 associate-iam-instance-profile --iam-instance-profile Arn=arn:aws:iam::************:instance-profile/CloudWatchAgentServerRole,Name=CloudWatchAgentServerRole --instance-id i-0187ccb3f08c4c428

上記コマンド実行後、出力される内容。

{
    "IamInstanceProfileAssociation": {
        "AssociationId": "iip-assoc-029c234ab9f65bfa5",
        "InstanceId": "i-0187ccb3f08c4c428",
        "IamInstanceProfile": {
            "Arn": "arn:aws:iam::************:instance-profile/CloudWatchAgentServerRole",
            "Id": "AIPAVWE26J2VBAQKM4TP2"
        },
        "State": "associating"
    }
}

アタッチされたか確認(1)

[cloudshell-user@ip-10-0-165-114 ~]$ aws ec2 describe-iam-instance-profile-associations

上記コマンド実行後、出力される内容。

{
    "IamInstanceProfileAssociations": [
        {
            "AssociationId": "iip-assoc-029c234ab9f65bfa5",
            "InstanceId": "i-0187ccb3f08c4c428",
            "IamInstanceProfile": {
                "Arn": "arn:aws:iam::************:instance-profile/CloudWatchAgentServerRole",
                "Id": "AIPAVWE26J2VBAQKM4TP2"
            },
            "State": "associated"
        }
    ]
}

WEB01(i-0187ccb3f08c4c428)で作業

認証情報の確認

Typeがiam-roleになっていることを確認します。
iamユーザ認証情報がある場合、 rm -rf ~/.aws で削除してください。

[root@web01 ~]# aws configure list

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************BFFF         iam-role
secret_key     ****************LrBR         iam-role
    region                <not set>             None    None

[root@web01 ~]# aws ec2 describe-tags --region ap-south-1

EC2タグ情報を取得できてれば正常にIAMロールが適用されています。
※ 筆者費用節約のため、ムンバイリージョンで使用しています、リージョンがムンバイになっているので適宜、読者のリージョンへ置換してください。

ログ転送設定

以下、内容の設定を書き込みます。
ロググループが「apache_access_log」となり、ログストリームが「{instance_id}」となります。
※「{instance_id}」は置換しません。

[root@web01 ~]# vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/amazon-cloudwatch-agent.json

{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "root"
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/httpd/access_log",
                        "log_group_name": "apache_access_log",
                        "log_stream_name": "{instance_id}"
                    },
                    {
                        "file_path": "/var/log/httpd/error_log",
                        "log_group_name": "apache_error_log",
                        "log_stream_name": "{instance_id}"
                    }
                ]
            }
        }
    }
}

cloudwatch-agent起動

[root@web01 ~]# systemctl status amazon-cloudwatch-agent.service

● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

[root@web01 ~]# systemctl start amazon-cloudwatch-agent.service

[root@web01 ~]# systemctl status amazon-cloudwatch-agent.service

● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; disabled; vendor preset: disabled)
   Active: active (running) since 月 2021-10-18 03:13:36 JST; 3s ago
 Main PID: 30827 (amazon-cloudwat)
   CGroup: /system.slice/amazon-cloudwatch-agent.service
           mq30827 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -e...

10月 18 03:13:36 web01 systemd[1]: Started Amazon CloudWatch Agent.
10月 18 03:13:36 web01 start-amazon-cloudwatch-agent[30827]: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist or can...ing it.
10月 18 03:13:36 web01 start-amazon-cloudwatch-agent[30827]: Valid Json input schema.
10月 18 03:13:36 web01 start-amazon-cloudwatch-agent[30827]: I! Detecting run_as_user...
Hint: Some lines were ellipsized, use -l to show in full.

[root@web01 ~]# systemctl enable amazon-cloudwatch-agent.service

Created symlink from /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service to /etc/systemd/system/amazon-cloudwatch-agent.service.

[root@web01 ~]# systemctl is-enabled amazon-cloudwatch-agent.service

enabled

CloudWatchログの確認

※ ap-south-1.console.aws.amazon.com/cloudwatch/home?region=ap-south-1#logsV2:log-groups

※ 筆者費用節約のため、ムンバイリージョンで使用しています、リンクリージョンがムンバイになっているので適宜、読者のリージョンへ置換してください。

ここまでで、web01のみ設定しましたので、CloudWatchログにweb01のapacheログが出力されていれば問題ありません。
web02については後ほど設定します。

キャプチャした画像は以下に載せますのでこのような感じになっていると思います。

今の段階でのログ構造は以下の通りです。

CloudWatch > Log groups > apache_access_log > i-0187ccb3f08c4c428(web01)
CloudWatch > Log groups > apache_error_log > i-0187ccb3f08c4c428(web01)

###############################################

ロググループ

###############################################

apache_access_log

###############################################

apache_error_log

###############################################

インスタンスプロファイルアタッチ状態事前確認

以下で、AWS CloudShellを使用し、上記で作成したIAMロールをEC2インスタンスプロファイルに関連付けします。

※ 筆者費用節約のため、ムンバイリージョンで使用しています、リンクリージョンがムンバイになっているので適宜、読者のリージョンへ置換してください。
※ ap-south-1.console.aws.amazon.com/cloudshell/home?region=ap-south-1

本記事内「アタッチされたか確認(1)」で実施した、「i-0187ccb3f08c4c428(web01)」に対してのみ「CloudWatchAgentServerRole」が割り当てられていることが確認できます。

i-001d084399cc4f4c4(web02)に対しても、「CloudWatchAgentServerRole」をアタッチする必要がありますので以降の手順でアタッチします。

[cloudshell-user@ip-10-0-165-114 ~]$ aws ec2 describe-iam-instance-profile-associations

上記コマンド実行後、出力される内容。

{
    "IamInstanceProfileAssociations": [
        {
            "AssociationId": "iip-assoc-029c234ab9f65bfa5",
            "InstanceId": "i-0187ccb3f08c4c428",
            "IamInstanceProfile": {
                "Arn": "arn:aws:iam::************:instance-profile/CloudWatchAgentServerRole",
                "Id": "AIPAVWE26J2VBAQKM4TP2"
            },
            "State": "associated"
        }
    ]
}

インスタンスプロファイルをEC2インスタンスにアタッチ(2)

i-001d084399cc4f4c4(web02)に対してもインスタンスプロファイルを関連付けます。

[cloudshell-user@ip-10-0-140-149 ~]$ aws ec2 associate-iam-instance-profile --iam-instance-profile Arn=arn:aws:iam::************:instance-profile/CloudWatchAgentServerRole,Name=CloudWatchAgentServerRole --instance-id i-001d084399cc4f4c4

{
    "IamInstanceProfileAssociation": {
        "AssociationId": "iip-assoc-0c08dd7a133816cc6",
        "InstanceId": "i-001d084399cc4f4c4",
        "IamInstanceProfile": {
            "Arn": "arn:aws:iam::************:instance-profile/CloudWatchAgentServerRole",
            "Id": "AIPAVWE26J2VBAQKM4TP2"
        },
        "State": "associating"
    }
}

アタッチされたか確認(2)

i-001d084399cc4f4c4(web02)に対しても、「CloudWatchAgentServerRole」をアタッチされたことが確認できます。

[cloudshell-user@ip-10-0-140-149 ~]$ aws ec2 describe-iam-instance-profile-associations

{
    "IamInstanceProfileAssociations": [
        {
            "AssociationId": "iip-assoc-029c234ab9f65bfa5",
            "InstanceId": "i-0187ccb3f08c4c428",
            "IamInstanceProfile": {
                "Arn": "arn:aws:iam::************:instance-profile/CloudWatchAgentServerRole",
                "Id": "AIPAVWE26J2VBAQKM4TP2"
            },
            "State": "associated"
        },
        {
            "AssociationId": "iip-assoc-0c08dd7a133816cc6",
            "InstanceId": "i-001d084399cc4f4c4",
            "IamInstanceProfile": {
                "Arn": "arn:aws:iam::************:instance-profile/CloudWatchAgentServerRole",
                "Id": "AIPAVWE26J2VBAQKM4TP2"
            },
            "State": "associated"
        }
    ]
}

WEB02(i-001d084399cc4f4c4)で作業

サーバへCloudWatchエージェントをインストール

[root@web01 ~]# yum install amazon-cloudwatch-agent

認証情報の確認

Typeがiam-roleになっていることを確認します。
iamユーザ認証情報がある場合、 rm -rf ~/.aws で削除してください。

[root@web02 ~]# aws configure list

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************Y45T         iam-role
secret_key     ****************bgP+         iam-role
    region                <not set>             None    None

[root@web02 ~]# aws ec2 describe-tags --region ap-south-1

EC2タグ情報を取得できてれば正常にIAMロールが適用されています。
※ 筆者費用節約のため、ムンバイリージョンで使用しています、リージョンがムンバイになっているので適宜、読者のリージョンへ置換してください。

ログ転送設定

以下、内容の設定を書き込みます。
ロググループが「apache_access_log」となり、ログストリームが「{instance_id}」となります。
※「{instance_id}」は置換しません。

[root@web02 ~]# vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/amazon-cloudwatch-agent.json

{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "root"
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/httpd/access_log",
                        "log_group_name": "apache_access_log",
                        "log_stream_name": "{instance_id}"
                    },
                    {
                        "file_path": "/var/log/httpd/error_log",
                        "log_group_name": "apache_error_log",
                        "log_stream_name": "{instance_id}"
                    }
                ]
            }
        }
    }
}

cloudwatch-agent起動

[root@web02 ~]# systemctl status amazon-cloudwatch-agent.service

● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

[root@web02 ~]# systemctl enable --now amazon-cloudwatch-agent.service

Created symlink from /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service to /etc/systemd/system/amazon-cloudwatch-agent.service.

[root@web02 ~]# systemctl status amazon-cloudwatch-agent.service

● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2021-10-20 00:38:07 JST; 4s ago
 Main PID: 3480 (amazon-cloudwat)
   CGroup: /system.slice/amazon-cloudwatch-agent.service
           mq3480 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconf...

10月 20 00:38:07 web02  systemd[1]: Started Amazon CloudWatch Agent.
10月 20 00:38:07 web02  start-amazon-cloudwatch-agent[3480]: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist or...ing it.
10月 20 00:38:07 web02  start-amazon-cloudwatch-agent[3480]: Valid Json input schema.
10月 20 00:38:07 web02  start-amazon-cloudwatch-agent[3480]: I! Detecting run_as_user...
Hint: Some lines were ellipsized, use -l to show in full.

CloudWatchログの確認

※ ap-south-1.console.aws.amazon.com/cloudwatch/home?region=ap-south-1#logsV2:log-groups

※ 筆者費用節約のため、ムンバイリージョンで使用しています、リンクリージョンがムンバイになっているので適宜、読者のリージョンへ置換してください。

ここまでで、web01、web02を設定しましたので、CloudWatchログにweb02が追加されていれば問題ありません。

キャプチャした画像は以下に載せますのでこのような感じになっていると思います。

今の段階でのログ構造は以下の通りです。

CloudWatch
 > Log groups
  > apache_access_log
   > i-0187ccb3f08c4c428(web01)
   > i-001d084399cc4f4c4(web02)

CloudWatch
 > Log groups
  > apache_error_log
   > i-0187ccb3f08c4c428(web01)
   > i-001d084399cc4f4c4(web02)

###############################################

ロググループ

###############################################

apache_access_log

###############################################

apache_error_log

###############################################

まとめ

途中、web02のAZが調子悪く、AWS CLIのもたつきがあったせいか、CloudWatchエージェントインストール後、json設定ファイルを置き、起動を試みましたがエラーとなり起動できませんでした。

仕方ないので別AZに建て直し再度設定しなおしたらすんなり起動でき、CloudWatchログにもログが吐かれ始めホットした筆者でした。

AWS CLIのレスポンスが異様に遅い場合は、要注意ですね。

次回は、解析編を執筆予定なのでお楽しみに。

追記

ELB(ALB)からEC2インスタンスにアクセスしてくる接続元IPを知りたいので、apacheのログ形式に「%{X-Forwarded-For}i」を付与しておいてください。
※付与するインスタンスは、web01, web02になります。

diff httpd.conf.org httpd.conf

@@ -198,7 +198,7 @@
     # The following directives define some format nicknames for use with
     # a CustomLog directive (see below).
     #
-    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
     LogFormat "%h %l %u %t \"%r\" %>s %b" common

     <IfModule logio_module>

返信を残す

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

CAPTCHA