ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AWS] EC2에 CloudWatch Agent 구성하여 로그 중앙 집중화
    Cloud/AWS 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에서 정상적으로 로그가 수집되는 것을 보실 수 있습니다.

    참고 링크


    'Cloud > AWS' 카테고리의 다른 글

    특정 AWS 계정과 AMI 공유  (0) 2021.07.21
    [AWS] Auto Scaling Group 항목 설명  (0) 2020.04.23
    [AWS] Certificate Manager 인증서 등록  (0) 2020.04.16
    [AWS] 탄력적 IP (Elastic IP) 설명  (0) 2020.04.16

    댓글

작은거인's Blog / Designed by TISTORY