참고
모니터링
NOTE
Springboot Actuator을 활용한 JVM을 모니터링한다!
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
Groovy
복사
gradle 추가
management:
endpoints:
web:
exposure:
include: "*" # *으로 표기하면 전체
YAML
복사
설정추가 (이렇게 해야 모든 액츄에이터 확인이 가능하다.)
Prometheus & Grafana 연동
NOTE
version: '3'
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- ./grafana/volume:/var/lib/grafana
networks:
- br_app
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus/config:/etc/prometheus
- ./prometheus/volume:/prometheus
restart:
- always
networks:
- br_app
volumes:
grafana-data:
networks:
br_app:
external: true
YAML
복사
grafana & prometheus 설치
Portainer를 활용해서 서버의 컨테이너 확인
NOTE
portainer를 활용해 여러대의 서버에 대한 컨테이너를 확인할 수 있다.
- name: Update Docker service configuration file
ansible.builtin.lineinfile:
path: /lib/systemd/system/docker.service
regexp: "^ExecStart="
line: "ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375"
become: yes
Bash
복사
ansible에서 각 서버에 대해 docker api를 활성화하기 위해 2375port를 오픈한다.
주의점!
•
2375port에 대해서 모든 ip허용을 하면, 외부에서 악성 컨테이너가 설치되 좀비서버가 될 가능성이 있다!
•
실제로 당했으므로 주의해서 CIDR을 적용할것
Cloudwatch + Grafana 연동
NOTE
DataSource에서 CloudWatch 선택!
•
IAM의 공개키, 비밀키, 지역을 입력한다!
다음과 같이 AWS EC2의 정보를 가져올 수 있다!
Cloudwatch + Discord 알람
NOTE
테라폼으로 CloudWatch에서 각 인스턴스 CPU 75이상일시 경고알람
Amazon SNS를 이용한 Discord등록
import json
import os
import requests
def lambda_handler(event, context):
discord_webhook_url = 'https://discordapp.com/api/webhooks/1102766108425072671/-UyXPmGshE1Mju6WD6Rj9evO4tKsvyBzOTkF7Qc5FwKZ4fjAKG5tqkIWtY2BPCOJ0c5Z'
message_json = json.loads(event['Records'][0]['Sns']['Message'])
# 코드 블록 형식으로 메시지를 보낼 수 있도록 문자열에 추가
formatted_message = f"""
내용 : {message_json.get('AlarmDescription')}
시간 : {message_json.get('StateChangeTime')}
"""
# Discord 임베드 생성
embed = {
"title": f"{message_json.get('AlarmName')}",
"description": formatted_message,
"color": 16711680 # 0x00FFFF에 해당하는 10진수 값. 이 값을 변경하여 다른 색상을 사용할 수 있습니다.
}
data = {
'embeds': [embed] # 임베드 리스트를 data 딕셔너리에 추가
}
requests.post(discord_webhook_url, data=json.dumps(data), headers={"Content-Type": "application/json"})
Python
복사
Cloudwatch에서 경보가 발생하면 Lamda를 동작시켜 Amazon SNS에 등록된 디스코드로 알람을보낸다!
디스코드로 알람이옴!