Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

09장. 로그 분석 #9

Open
aegis1920 opened this issue Apr 10, 2021 · 7 comments
Open

09장. 로그 분석 #9

aegis1920 opened this issue Apr 10, 2021 · 7 comments
Labels

Comments

@aegis1920
Copy link

질문을 남겨주세요!

@KS-KIM
Copy link

KS-KIM commented Apr 10, 2021

cloudwatch agent 설치

$ cd /var/www
$ wget https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip
$ unzip AmazonCloudWatchAgent.zip -d AmazonCloudWatchAgent
$ rm AmazonCloudWatchAgent.zip
$ cd AmazonCloudWatchAgent/
$ sudo ./install.sh

cloudwatch agent 설치 마법사 실행

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

특정 설정파일을 이용하여 cloudwatch agent 서비스 시작

$ sudo /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 -s

cloudwatch agent 시작

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a start

cloudwatch agent 실행 상태 확인

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl  -m ec2 -a status

cloudwatch agent 멈춰!

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop

cloudwatch agent 설정 파일 작성

/opt/aws/amazon-cloudwatch-agent/bin/config.json

{
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "/var/log/nginx/access.log",
						"log_group_name": "exercise-nginx-access-logs",
						"log_stream_name": "{instance_id}"
					}
				]
			}
		}
	},
	"agent": {
		"metrics_collection_interval": 30,
		"run_as_user": "root"
	},
	"metrics": {
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"cpu": {
				"measurement": [
					"cpu_usage_idle",
					"cpu_usage_iowait",
					"cpu_usage_user",
					"cpu_usage_system"
				],
				"metrics_collection_interval": 30,
				"totalcpu": false
			},
			"disk": {
				"measurement": [
					"used_percent",
					"inodes_free"
				],
				"metrics_collection_interval": 30,
				"resources": [
					"*"
				]
			},
			"diskio": {
				"measurement": [
					"io_time"
				],
				"metrics_collection_interval": 30,
				"resources": [
					"*"
				]
			},
			"mem": {
				"measurement": [
					"mem_used_percent"
				],
				"metrics_collection_interval": 30
			},
			"swap": {
				"measurement": [
					"swap_used_percent"
				],
				"metrics_collection_interval": 30
			}
		}
	}
}

@aegis1920
Copy link
Author

aegis1920 commented Apr 10, 2021

nginx의 위치가 책과 다른 부분이 있어 내용 추가합니다 :)

sudo chmod -R 755 /var/log/nginx; # root계정만 nginx 디렉토리에 접근이 가능하기에 권한을 풀어줌

sudo vim /opt/aws/amazon-cloudwatch-agent/bin/config.json

"logs": {
        "logs_collected": {
                "files": {
                        "collect_list": [
                                {
                                        "file_path": "/var/log/nginx/access.log", # nginx 경로가 다름!
                                        "log_group_name": "exercise-nginx-access-logs",
                                        "log_stream_name": "i-086a308a797ad08b8" # 인스턴스의 id를 자동 할당 해주기 위해선 "{instance_id}"가 맞습니다!
                                }
                        ]
                }
        }
}

@KS-KIM
Copy link

KS-KIM commented Apr 10, 2021

@aegis1920 log stream name을 지정할 때 인스턴스 ID를 직접 지정하신 이유가 있나요?

@aegis1920
Copy link
Author

@KS-KIM "log_stream_name": "{instance_id}" 으로 적게 되면 로그 스트림의 이름이 {instance_id}로 나오게 됩니다.
저는 책에 있는 부분을 그대로 따라했는데 p. 240에 그림 9.12에 로그 스트림의 이름을 보면 i-로 시작되는 것으로 보아 인스턴스의 ID를 지정하는 것으로 보여서 그렇게 했습니다.
로그 스트림의 이름을 인스턴스 ID로 지정해야하는 정확한 이유는 모르겠지만 로그 스트림을 해당 인스턴스와 연결하고 있다고 판별하기 위해서 아닐까요?

@KS-KIM
Copy link

KS-KIM commented Apr 10, 2021

@aegis1920

log_stream_name – 선택 사항. 에서 로그 스트림 이름으로 사용할 항목을 지정합니다.CloudWatch Logs. 이름의 일부로 , {instance_id} {hostname}, 및 {local_hostname}를 이름 내의 변수{ip_address}로 사용할 수 있습니다. {hostname} 는 EC2 메타데이터에서 호스트 이름을 검색하고 네트워크 구성 파일에서 호스트 이름을 {local_hostname} 사용합니다.

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html

image

저는 {instance_id}로 두면 자동으로 해당 EC2의 인스턴스 ID로 설정되더라구요. 위 문서에서도 로그 스트림 이름에서 위와 같은 변수를 사용할 수 있다고 나오네요. 추후에 auto-scaling을 적용하면 인스턴스가 수시로 바뀌어 가변 설정해 주는것이 좋을 것 같아요:)
로그 스트림 이름이 제대로 출력되지 않는다면, 해결법을 찾아보는것도 좋을 것 같아요. 참고로, 로그 스트림명을 명시적으로 지정하지 않으면 기본으로 인스턴스 ID로 설정된다고 하네요.

이 필드를 생략하면 글로벌 log_stream_name 섹션의 logs 파라미터 값이 사용됩니다. 이 값도 생략하면 기본값 {instance_id}가 사용됩니다.

로그스트림 이름을 인스턴스 이름으로 지정하는 이유는 어떤 인스턴스에서 이슈가 발생했는지 트래킹 하기 위한 목적도 있지 않나 싶습니다.

@aegis1920
Copy link
Author

aegis1920 commented Apr 10, 2021

{instance_id}를 그대로 써도 자동으로 인스턴스 ID로 설정되나요? 저는 {instance_id} 이게 그대로 나와서 직업 인스턴스 ID를 적어줬습니다. 제가 뭔가 오타를 냈나보네요;; 알려주셔서 감사합니다 👍

나중에 다시 보니까 {instanct-id}로 적고 있었습니다ㅎㅎ... 언더바 오타였네요!

@KS-KIM
Copy link

KS-KIM commented Apr 11, 2021

log appender에 설정할 수 있는 encoder가 있네요. 이 방식을 이용하면 application에서 발생한 로그를 json 형식으로 바꿔서 logstash로 쏴줄 수 있나봅니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants