Cloud/AWS

[AWS] EC2에 CloudWatch Agent 구성하여 로그 중앙 집중화

`작은거인` 2021. 7. 16. 13:15

Amazon Linux 2에 CloudWatch Agent를 설치하고 구성하여 로그 중앙 집중화하는 방법을 알아보겠습니다.

 

  • EC2 인스턴스 로그 수집 및 모니터링
    • CloudWatch Logs를 사용하면 로그 데이터를 통해 애플리케이션과 시스템을 모니터링 할 수 있음
    • CloudWatch Logs는 모니터링하는데 로그 데이터를 사용하므로 코드를 변경할 필요가 없음
    • CloudWatch Logs에서는 애플리케이션 로그에서 발생하는 오류의 수를 추적하고 오류 비율이 지정한 임계값을 초과할 때마다 알림 전송이 가능
  • CloudWatch Logs 로그 보존
    • 기본적으로 로그는 무기한 저장되고 만료 기간은 없음 ( 데이터 보존 기관 설정 가능 )
    • CloudWatch Logs를 사용하여 내구성이 뛰어난 스토리지에 로그데이터를 저장
    • 필터 패턴을 사용하여 로그 이벤트에서 일치하는 단어, 구문 또는 값을 검색이 가능
  • CloudWatch Logs 설정 방법
    1. EC2 에서 사용할 IAM Role을 생성 및 설정
    2. CloudWatch Logs 에이전트 설치 및 설정
    3. CloudWatch Logs 에서 수집된 로그 확인

 

(AWS) EC2 에서 사용할 IAM Role을 생성 및 설정


  • IAM Role 생성 시 trusted entity를 EC2로 선택하고 CloudWatchAgentServerPolicy를 추가 합니다.https://blog.kakaocdn.net/dn/q2w5z/btqWsJoIpk3/o5ZtOximhUQr75H9wKqCW1/img.png
  • CloudWatchAgentServerPolicy 내용을 살펴보면 아래와 같습니다.
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "cloudwatch:PutMetricData",
                    "ec2:DescribeVolumes",
                    "ec2:DescribeTags",
                    "logs:PutLogEvents",
                    "logs:DescribeLogStreams",
                    "logs:DescribeLogGroups",
                    "logs:CreateLogStream",
                    "logs:CreateLogGroup"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ssm:GetParameter"
                ],
                "Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-*"
            }
        ]
    }​
  • EC2 인스턴스를 선택하고 보안IAM 역할 수정을 선택하여 위에서 생성한 Role을 연결합니다.

 

 

 

(EC2) CloudWatch Logs 에이전트 설치 및 설정


Agent 구성방식은 AWS 에서 제공하는 Wizard를 사용하는 방법과 구성파일을 수동으로 생성하는 방법이 있습니다. 포스팅에서는 수동으로 구성하는 방법에 대해서 설명하겠습니다.

  • EC2 CloudWatch Agent RPM 다운로드 합니다.
    [ec2-user@ip-10-0-11-111 ~]$ sudo su -
    [root@ip-10-0-11-111 ~]# wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm;
    --2021-07-16 12:00:42--  https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
    Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.128.53
    Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.128.53|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 41427996 (40M) [application/octet-stream]
    Saving to: ‘amazon-cloudwatch-agent.rpm’
    
    100%[================================================================================>] 41,427,996  8.49MB/s   in 5.6s
    
    2021-07-16 12:00:49 (7.04 MB/s) - ‘amazon-cloudwatch-agent.rpm’ saved [41427996/41427996]​
  • EC2 CloudWatch Agent RPM 설치 & 확인 합니다.
    [root@ip-10-0-11-111~]# rpm -Uvh amazon-cloudwatch-agent.rpm;
    Preparing...                          ################################# [100%]
    create group cwagent, result: 0
    create user cwagent, result: 0
    Updating / installing...
       1:amazon-cloudwatch-agent-1.247348.################################# [100%]
    
    [root@ip-10-0-11-229 nginx]# rpm -qa | grep amazon-cloudwatch-agent
    amazon-cloudwatch-agent-1.247348.0b251302-1.x86_64​
  • EC2 Heredoc 문법을 사용하여 config.json 파일에 설정 파일을 만듭니다.
    cat <<EOF > /opt/aws/amazon-cloudwatch-agent/bin/config.json
    {
        "agent": {
            "metrics_collection_interval": 30,
            "run_as_user": "root"
        },
        "logs": {
            "logs_collected": {
                "files": {
                    "collect_list": [
                        {
                            "file_path": "/var/log/nginx/access.log",
                            "log_group_name": "WEB_LogGroup",
                            "log_stream_name": "[WEB] {instance_id} (access.log)"
                        },
                        {
                            "file_path": "/var/log/nginx/error.log",
                            "log_group_name": "WEB_LogGroup",
                            "log_stream_name": "[WEB] {instance_id} (error.log)"
                        }
                    ]
                }
            }
        }
    }
    EOF​
     
  • EC2 CloudWatch 에이전트를 시작합니다.
    [root@ip-10-0-11-111 nginx]# /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json;
    ****** processing amazon-cloudwatch-agent ******
    /opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source file:/opt/aws/amazon-cloudwatch-agent/bin/config.json --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
    Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
    Start configuration validation...
    /opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
    2021/07/16 12:08:13 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
    Valid Json input schema.
    I! Detecting run_as_user...
    No csm configuration found.
    No metric configuration found.
    Configuration validation first phase succeeded
    /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
    Configuration validation second phase succeeded
    Configuration validation succeeded
    
    ****** processing amazon-cloudwatch-agent ******
    Redirecting to /bin/systemctl stop amazon-cloudwatch-agent.service​
  • EC2 CloudWatch 에이전트를 잘 동작하는지 확인 해보도록 하겠습니다.
    [root@ip-10-0-11-111 nginx]# /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status;
    {
      "status": "running",
      "starttime": "2021-07-16T03:09:07+0000",
      "configstatus": "configured",
      "cwoc_status": "stopped",
      "cwoc_starttime": "",
      "cwoc_configstatus": "not configured",
      "version": "1.247348.0b251302"
    }
    
    [root@ip-10-0-11-111 nginx]# ps -ef | grep cloudwatch
    root      4308     1  0 12:09 ?        00:00:05 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwatch-agent/etc/env-config.json -pidfile /opt/aws/amazon-cloudwatch-agent/var/amazon-cloudwatch-agent.pid
    root      4501  3794  0 12:46 pts/1    00:00:00 grep --color=auto cloudwatch​
  • EC2 config.json 구성 파일에서 설정한 값이 어떻게 CloudWatch Logs로 보여줄지 amazon-cloudwatch-agent.toml 파일을 통해서 확인할 수 있습니다.
    # cat /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
    [agent]
      collection_jitter = "0s"
      debug = false
      flush_interval = "1s"
      flush_jitter = "0s"
      hostname = ""
      interval = "30s"
      logfile = "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
      logtarget = "lumberjack"
      metric_batch_size = 1000
      metric_buffer_limit = 10000
      omit_hostname = false
      precision = ""
      quiet = false
      round_interval = false
    
    [inputs]
    
      [[inputs.logfile]]
        destination = "cloudwatchlogs"
        file_state_folder = "/opt/aws/amazon-cloudwatch-agent/logs/state"
    
        [[inputs.logfile.file_config]]
          file_path = "/var/log/nginx/access.log"
          from_beginning = true
          log_group_name = "WEB_LogGroup"
          log_stream_name = "[WEB] i-012345665656e42fd03 (access.log)"
          pipe = false
    
        [[inputs.logfile.file_config]]
          file_path = "/var/log/nginx/error.log"
          from_beginning = true
          log_group_name = "WEB_LogGroup"
          log_stream_name = "[WEB] i-012345665656e42fd03 (error.log)"
          pipe = false
        [inputs.logfile.tags]
          metricPath = "logs"
    
    [outputs]
    
      [[outputs.cloudwatchlogs]]
        force_flush_interval = "5s"
        log_stream_name = "i-012345665656e42fd03"
        region = "ap-northeast-2"
        tagexclude = ["metricPath"]
        [outputs.cloudwatchlogs.tagpass]
          metricPath = ["logs"]​
  • (선택) EC2 편의성을 위해 마법사를 사용하여 에이전트 구성 파일을 생성할 수 있습니다. 나중에 파일을 수동으로 편집하여 지표 또는 로그를 추가하거나 제거할 수 있습니다.
    $ /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
    ...​

(AWS) CloudWatch Logs 에서 수집된 로그 확인


  • AWS Cloudwatch Logs에서 정상적으로 로그가 수집되는 것을 보실 수 있습니다.

참고 링크