흰 스타렉스에서 내가 내리지

Amazon OpenSearch 그리고 logstash 그리고 Spring boot 본문

AWS

Amazon OpenSearch 그리고 logstash 그리고 Spring boot

주씨. 2024. 7. 10. 11:58
728x90

Amazon OpenSearch 도메인 생성 

 

표준 생성 > 개발 및 테스트

 

 

 

OpenSearch 엔진을 써도 되고,. ElasticSearch 엔진을 써도 좋다.

나는 여기서는  ElasticSeach 7.10 버전을 쓰곘다. 

 

 

Instance family 를 General purpose 라 하고  인스턴스 유형을 가장 아래 레벨인 t3.small 로 하자..

요금 폭탄에 주의하자

참고로 지금도 계속 돈이 청구되고 있다. 피눈물이 난다. 

인턴 심사 끝나면 바로 끌거다...

 

 

노드 수 를 1로 하고, 나머지는 놔뒀다. 

하고 싶은대로 설정하자

 

 

 

AWS 네트워크를 관리할 수 있는 상황이라면 VPC 액세스를 하겠으나, 

난 그냥 퍼블릭 액세스로 설정하여 URL 을 발급할 수 있도록 하였다. 

 

 

 

세분화된 액세스 제어에서 마스터 사용자 생성을 하고 이름 암호를 쓴다. 

이건 앞으로 logstash 설정과 Kibana 대시보드에 접속할 때 쓰일 것이니 꼭 메모해 놓을 것

 

그리고 생성을 하면, 

 

ElasticSearch 엔드포인트와 Kibana 대시보드에 접속할 수 있는 URL 이 발급되었다.

 

 


Logstash 설치 

 

우리의 애플리케이션이 실행되고 있는 ec2 인스턴스에 보안그룹의 인바운드 규칙을 설정하자.

5000번 포트로 Logstach TCP 로그를 받고, 5044 로 Filebeat 로그를 받을 수 있다. 

이 포스팅에서는 Filebeat 를 쓰지는 않을거다. 

다음에 기회가 되면 정리해야지

 

ec2 인스턴스에 접속하여 도커를 설치하고 logstash 이미지를 다운받는다. 

이거까지 명령어는 알아서 입력하도록 하자. 

 

Logstash 설정 파일 생성 

pipline 폴더 생성 후 logstash conf 파일을 생성한다. 

input {
 tcp {
  port => 5000
  codec => json_lines
 }
}

output {
 elasticsearch {
  hosts => ["https://elasticsearch 엔드포인트 주소 넣기.es.amazonaws.com:443"]
  ssl => true
  index => "logstash-%{+YYYY.MM.dd}"
  user => "admin"
  password => "비밀번호~"
  ilm_enabled => false
 }
 stdout{}
}

 

이때 주의할 것은, hosts 엔드포인트 부분에 뒤에 443 포트 번호를 넣어줘야 한다. 

저거 때문에 하루를 꼬박 날렸다. 

 

 

Logstash 실행

docker run --name logstash -p 5000:5000 -p 5044:5044 -d -e LS_JAVA_OPTS="-Xms512M -Xmx512M -XX:ParallelGCThreads=1" -v /home/ec2-user/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf docker.elastic.co/logstash/logstash-oss:7.10.2

 

 

Logstash 로그 확인

docker logs -f logstash

 

Successfully started 문구를 확인했으면 끝났다. 

 

만약 실패했을 경우 위의 가이드를 정확히 잘 따라하였는지 다시 한 번 확인해 보자.

 


Spring boot 설정 

먼저 build.gradle 에 아래 의존성을 추가해줍니다. 

// logstash
	implementation 'net.logstash.logback:logstash-logback-encoder:6.6'

 

 

logback.spring.xml\

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">

    <!-- Console -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{10} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- Logstash -->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>localhost:5000</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"appname":"appname"}</customFields>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="LOGSTASH" />
    </root>
</configuration>

 

위와 같이 설정하면, Logstash 를 통해서 ElasticSearch 에 로그가 쌓이게 된다. 

 

 

운영환경에 따른 logback 설정

개발 시 로컬 환경에서는 로그를 남기지 않는다. 

logback.xml 경로를 application.yml 에서 설정해서 사용하면, 운영환경별로 로그를 보낼 수 있다. 

 

spring:
 profiles:
  active: local

... ...

logging:
 config: classpath:logback-spring-${spring.profiles.active}.xml

 


Kibana 대시보드 접속

OpenSearch 를 만들었을 때 제공해준 대시보드 퍼블릭 URL 로 접속한다. 

 

 

아 참고로, elasticsearch 도메인에서, 하단 탭 중에 '인덱스' 에 들어가서, 아래와 같이 우리가 로그로 찍을 인덱스가 적절하게 나타나는지 확인하자. 안 나타나면 뭔가 오류가 있는것.

 

 

 

다시 대시보드로 넘어가서, 왼쪽 내비게이션 탭에서 'Index Management' 를 누르자.

 

그리고 다시 왼쪽 내비게이션 탭에서 'Indices' 탭을 누른다. 

 

 

그러면 Logstash 를 통해 전달된 로그를 통해서 생성된 인덱스 목록을 확인할 수 있다. 

 

 

패턴 생성 

인덱스의 내용을 확인하거나 검색을 하기 위해서 패턴을 등록해야 한다. 

메뉴에서 'Stack Management' > 'Index Patterns' 

 

Index pattern 은 Logstash config 파일에 등록했던 패턴을 등록해줍니다. 

 

우리는 

index => "logstash-%{+YYYY.MM.dd}"

이렇게 만들었으므로, 'logstash-*' 와 같이 설정했다. 

 

 

나는 이미 등록을 해 놓아서 임시로 아무거나 함

 

패턴 등록후 Time field 에 @timestamp 를 primary time field 로 선택한다. 

 


로그 확인 

 

메뉴에서 Discover 를 선택한다. 

 

 

 

상단에 로그의 기간과 쿼리로 상세히 검색할 수 있다. 

 

쿼리 가이드는 아래 링크를 참고하면 된다. 

 

https://www.elastic.co/guide/en/kibana/7.10/kuery-query.html

 

Kibana Query Language | Kibana Guide [7.10] | Elastic

Terms without fields are matched against the default field in your index settings. If a default field is not set, terms are matched against all fields. For example, a query for response:200 searches for the value 200 in the response field, but a query for

www.elastic.co

 

 

 


권한 에러가 날 경우

 

대시보드에서 'Security' > 'Roles' > 'all_access'

 

 

 

 

'Mapped users' 탭에 들어가서, 'Manage mapping' 을 누르고

 

 

그 오류메시지에 나와있던 arn 을 추가해주면 된다. 

나중에 캡처한거라서, 아마 :root  arn 을 등록하면 되었던것 같다.