SW 개발

Graylog, Amazon ECS on Fargate에 설치하기

지단로보트 2024. 3. 12. 11:28

개요

  • Graylog 클러스터를 클라우드 환경에 셋업하기 위해 도커 베이스 이미지를 생성하고, 환경 변수를 작성하는 방법을 정리하였다.

아키텍쳐

  • MongoDB, OpenSearch, Graylog가 동일한 VPC(또는 VPC 피어링 연결)에 존재해야 한다.
  • 실시간으로 수신되는 로그를 받을 리스너로 TCP_UDP 12201 포트가 내부의 NLB에서 내부의 Graylog 서비스의 TCP_UDP 12201 포트로 로드 밸린성되어야 한다.
  • 외부에서 브라우저로 웹 인터페이스로 접속할 HTTPS 443 포트가 외부의 ALB에서 내부의 Graylog 서비스의 HTTP 9000 포트로 로드 밸런싱되어야 한다.

사전 조건

  • Graylog 5.2MongoDB 5.0 이상 버전을 요구한다. Amazon DocumentDB는 지원하지 않는다. MongoDB Atlas 클라우드를 이용한 클러스터 셋업을 추천한다.
  • Graylog 5.2OpenSearch 2.x 버전을 지원하고 권장한다. Amazon OpenSearch 셋업을 추천한다. (Elasticsearch 7.10 버전 또한 지원하지만 공식적으로 권장하지 않는다.)
  • Amazon OpenSearch 2.x에서는 아래 추가 설정이 필요하다.
# [1] compatibility.override_main_response_version: false
$ nano opensearch-settings.json
{
  "persistent": {
    "compatibility.override_main_response_version": false
  }
}

$ curl -X PUT -d @'opensearch-settings.json' -H 'Content-Type: application/json' 'https://{opensearh-uri}/_cluster/settings'
{
  "acknowledged": true,
  "persistent": {
    "compatibility": {
      "override_main_response_version": "false"
    }
  },
  "transient": {}
}

# [2] rest.action.multi.allow_explicit_index: true
Amazon OpenSearch Console > 클러스터 구성 편집 > Advanced Cluster Settings
- [Allow APIs that can span multiple indices and bypass index-specific access policies] 체크
- Max clause count: 1024 (입력)
- [모의 실행] 클릭
- [변경 사항 저장] 클릭

Dockerfile

  • Dockerfile 파일을 아래와 같이 작성한다. (현재 최신 버전은 이 링크에서 확인할 수 있다.) 옵션으로 베이스 이미지에 존재하지 않는 Slack 플러그인을 추가했다.
FROM docker.io/graylog/graylog:5.2.5
EXPOSE 9000
EXPOSE 12201
USER root
RUN apt-get update && apt-get install wget -y
RUN wget https://github.com/graylog-labs/graylog-plugin-slack/releases/download/3.1.0/graylog-plugin-slack-3.1.0.jar
COPY graylog-plugin-slack-3.1.0.jar /usr/share/graylog-server/plugin
USER graylog

어드민 계정 비밀번호 생성

  • 아래 환경 변수에 입력할 어드민 계정 비밀번호 생성을 위한 SecretHash 값을 생성한다.
# GRAYLOG_PASSWORD_SECRET 생성
$ sudo pwgen -N 1 -s 96
LSIN8jBbQBxVkIyBHtkOCyanjBLLyWWABhrQmFcHskJZ5DAr1pTRCto45UfO7RMSRlCaX2YQHS6udal3yUxwnmZisaBv0HMS

# GRAYLOG_ROOT_PASSWORD_SHA2 생성, 추후 최초 접속시 admin 계정 비밀번호로 사용)
$ echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
Enter Password: *****
610468bcb9b7a141e760b5d3d557c5e67678068016e224e48e304edb79dcc0ce

환경 변수

  • 컨테이너에 전달할 환경 변수를 아래와 같이 작성한다.
GRAYLOG_PASSWORD_SECRET={secret}
GRAYLOG_ROOT_PASSWORD_SHA2={hash}
GRAYLOG_BIND_ADDRESS=0.0.0.0:9000
GRAYLOG_HTTP_EXTERNAL_URI=https://{your-domain}.com/
GRAYLOG_ROOT_TIMEZONE=UTC
GRAYLOG_MONGODB_URI=mongodb+srv://{username:password@mongodb-uri}/graylog?retryWrites=true&w=majority
GRAYLOG_ELASTICSEARCH_HOSTS={opensearch-uri}

NLB 대상 그룹 설정

  • Graylog가 기본 제공하는 TCP_UDP 12201 포트는 NLB를 생성하여 로드 밸런싱해야 한다. 이 때 대상 그룹의 속성은 아래와 같이 설정되어야 한다.
- Deregistration delay: [30 seconds] 입력
- Connection termination on deregistration: [Enabled] 선택
- Stickiness: [Enabled] 선택
- Proxy protocol v2: [Disabled]
  • 배포 등의 행위로 기존의 Graylog 인스턴스가 종료될 때 Deregistration delay 옵션에 설정된 시간 동안 유예 시간을 가진 후, Connection termination on deregistration 옵션에 따라 로드 밸런서의 대상 그룹에서 제외되게 된다. UDP 로깅은 목적지의 연결 실패 여부를 확인하지 않기 때문에 존재하지 않는 인스턴스로의 로그 전송을 예방하기 위해 Connection termination on deregistration 옵션을 활성화하는 것이 필수이다.
  • UDP 로깅은 로그의 최종 압축된 크기가 8,192 bytes 이상일 경우 Chunking이 작동하여 패킷을 여러 개로 쪼개어 전송한다. Stickiness 옵션을 활성화해야 여러 개로 쪼개진 로그가 분산되지 않고 특정 인스턴스로만 전송된다.

참고 글