웹사이트 검색

Ubuntu 14.04에서 Rsyslog, Logstash 및 Elasticsearch를 사용하여 로그를 중앙 집중화하는 방법


Elastic의 기사

소개

조직에서 생성하는 수백만 개의 로그 라인을 이해하는 것은 어려운 과제일 수 있습니다. 한편으로 이러한 로그 라인은 애플리케이션 성능, 서버 성능 메트릭 및 보안에 대한 보기를 제공합니다. 반면에 로그 관리 및 분석은 시간이 많이 소요될 수 있으므로 점점 더 필요한 서비스를 채택하는 데 방해가 될 수 있습니다.

Logstash와 같은 오픈 소스 소프트웨어는 로그 데이터를 전송, 변환 및 저장하는 도구를 제공합니다.

이 자습서에서는 중앙 집중식 rsyslog 서버를 생성하여 여러 시스템의 로그 파일을 저장한 다음 Logstash를 사용하여 Elasticsearch 서버로 보내는 방법을 배웁니다. 여기에서 데이터를 가장 잘 분석하는 방법을 결정할 수 있습니다.

목표

이 자습서에서는 syslog, 특히 rsyslog로 알려진 변형에서 생성되거나 수신된 로그를 중앙 집중화하는 방법을 설명합니다. Syslog 및 rsyslog와 같은 syslog 기반 도구는 UNIX와 유사한 서버를 계속 실행하기 위해 실행되는 많은 프로그램과 커널에서 중요한 정보를 수집합니다. syslog는 단순한 프로그램이 아니라 표준이므로 많은 소프트웨어 프로젝트에서 syslog로의 데이터 전송을 지원합니다. 이 데이터를 중앙 집중화하면 보다 쉽게 보안을 감사하고 애플리케이션 동작을 모니터링하며 기타 중요한 서버 정보를 추적할 수 있습니다.

중앙 집중식 또는 집계 rsyslog 서버에서 데이터를 Logstash로 전달할 수 있습니다. Logstash는 로그 데이터를 Elasticsearch로 보내기 전에 추가 구문 분석 및 보강할 수 있습니다.

이 자습서의 최종 목표는 다음과 같습니다.

  1. 단일 클라이언트(또는 전달) rsyslog 서버 설정
  2. rsyslog 클라이언트에서 로그를 수신하도록 단일 서버(또는 수집) rsyslog 서버 설정
  3. rsyslog 수집 서버에서 메시지를 수신하도록 Logstash 인스턴스 설정
  4. Logstash에서 데이터를 수신하도록 Elasticsearch 서버 설정

전제 조건

동일한 DigitalOcean 데이터 센터에서 사설 네트워킹이 활성화된 다음 Droplet을 생성합니다.

  • rsyslog-client라는 우분투 14.04 드롭릿
  • 중앙 집중식 로그가 저장되고 Logstash가 설치될 rsyslog-server라는 Ubuntu 14.04 Droplet(1GB 이상)
  • Ubuntu 14.04에서 Elasticsearch를 설치하고 구성하는 방법에서 Elasticsearch가 설치된 Ubuntu 14.04 Droplet

또한 각 서버에 대해 sudo 권한이 있는 루트가 아닌 사용자가 필요합니다. Ubuntu 14.04의 초기 서버 설정에서 이를 설정하는 방법을 설명합니다.

참고: 성능을 최대화하기 위해 Logstash는 기본적으로 1GB의 메모리를 할당하려고 시도하므로 중앙 집중식 서버 인스턴스의 크기가 적절하게 조정되었는지 확인하십시오.

Droplet을 생성하는 동안 사설 네트워킹을 활성화하는 방법에 대한 도움말은 DigitalOcean 사설 네트워킹 설정 및 사용 방법을 참조하십시오.

사설 네트워킹 없이 드롭릿을 만든 경우 기존 드롭릿에서 DigitalOcean 사설 네트워킹을 활성화하는 방법을 참조하십시오.

1단계 - 사설 IP 주소 결정

이 섹션에서는 각 Droplet에 할당되는 사설 IP 주소를 결정합니다. 이 정보는 자습서를 통해 필요합니다.

각 Droplet에서 ifconfig 명령을 사용하여 해당 IP 주소를 찾습니다.

  1. sudo ifconfig -a

-a 옵션은 모든 인터페이스를 표시하는 데 사용됩니다. 기본 이더넷 인터페이스는 일반적으로 eth0라고 합니다. 그러나 이 경우 개인 IP 주소인 eth1의 IP를 원합니다. 이러한 사설 IP 주소는 인터넷을 통해 라우팅할 수 없으며 사설 LAN에서 통신하는 데 사용됩니다. 이 경우 보조 인터페이스를 통해 동일한 데이터 센터의 서버 간에 통신합니다.

출력은 다음과 유사합니다.

eth0      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:01  
          inet addr:123.456.78.90  Bcast:123.456.78.255  Mask:255.255.255.0
          inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:168 errors:0 dropped:0 overruns:0 frame:0
          TX packets:137 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:18903 (18.9 KB)  TX bytes:15024 (15.0 KB)

eth1      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:02  
          inet addr:10.128.2.25  Bcast:10.128.255.255  Mask:255.255.0.0
          inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:468 (468.0 B)  TX bytes:398 (398.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

여기서 주목해야 할 섹션은 eth1이고 해당 inet addr 내에 있습니다. 이 경우 개인 네트워크 주소는 10.128.2.25입니다. 이 주소는 동일한 지역 내에서 사설 네트워킹이 활성화된 다른 서버에서만 액세스할 수 있습니다.

3개의 물방울 모두에 대해 이 단계를 반복해야 합니다. 이러한 개인 IP 주소를 안전한 곳에 저장하십시오. 이 튜토리얼 전체에서 사용됩니다.

2단계 - Elasticsearch에 대한 바인딩 주소 설정

전제 조건의 일부로 자체 Droplet에 Elasticsearch를 설정합니다. Ubuntu 14.04에서 Elasticsearch를 설치 및 구성하는 방법 자습서에서는 다른 서버가 서비스에 액세스할 수 없도록 바인드 주소를 localhost로 설정하는 방법을 보여줍니다. 그러나 Logstash가 사설 네트워크 주소를 통해 데이터를 보낼 수 있도록 이를 변경해야 합니다.

우리는 Elasticsearch를 사설 IP 주소에 묶을 것입니다. Elasticsearch는 이 IP 주소에 대한 요청만 수신합니다.

Elasticsearch 서버에서 구성 파일을 편집합니다.

  1. sudo nano /etc/elasticsearch/elasticsearch.yml

network.bind_host가 포함된 줄을 찾습니다. 주석 처리된 경우 줄 시작 부분에서 # 문자를 제거하여 주석 처리를 해제하십시오. 값을 다음과 같이 Elasticsearch 서버의 사설 IP 주소로 변경합니다.

network.bind_host: private_ip_address

마지막으로 Elasticsearch를 다시 시작하여 변경 사항을 활성화합니다.

  1. sudo service elasticsearch restart

경고: 신뢰하는 서버만 Elasticsearch에 연결하도록 허용하는 것이 매우 중요합니다. iptables를 사용하는 것이 좋습니다. 이 튜토리얼에서는 Logstash가 실행 중인 rsyslog-server Droplet의 사설 IP 주소만 신뢰하기를 원합니다.

3단계 - 데이터 수신을 위한 중앙 집중식 서버 구성

이 섹션에서는 포트 514에서 다른 syslog 서버로부터 데이터를 수신할 수 있는 중앙 집중식 서버가 되도록 rsyslog-server Droplet을 구성합니다.

다른 syslog 서버에서 데이터를 수신하도록 rsyslog-server를 구성하려면 rsyslog-server Droplet에서 /etc/rsyslog.conf를 편집합니다.

  1. sudo nano /etc/rsyslog.conf

rsyslog.conf에서 이미 주석 처리된 다음 행을 찾으십시오.

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

각 섹션의 첫 줄($ModLoad imudp$ModLoad imtcp)은 imudpimtcp 모듈을 로드합니다. 각기. imudp는 입력 모듈 udp를 나타내고 imtcp는 입력 모듈 tcp를 나타냅니다. 이 모듈은 다른 syslog 서버에서 들어오는 데이터를 수신 대기합니다.

각 섹션의 두 번째 줄($UDPSerververRun 514$TCPServerRun 514)은 rsyslog가 포트 514(이는 syslog 기본 포트).

이러한 모듈과 서버를 활성화하려면 이제 파일에 다음이 포함되도록 줄의 주석을 제거하십시오.

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

rsyslog 구성 파일을 저장하고 닫습니다.

다음을 실행하여 rsyslog를 다시 시작하십시오.

  1. sudo service rsyslog restart

중앙 집중식 rsyslog 서버는 이제 원격 syslog(rsyslog 포함) 인스턴스의 메시지를 수신하도록 구성되었습니다.

팁: rsyslog 구성 파일의 유효성을 검사하려면 sudo rsyslogd -N1 명령을 실행할 수 있습니다.

4단계 - 데이터를 원격으로 전송하도록 rsyslog 구성

이 섹션에서는 마지막 단계에서 구성한 ryslog-server Droplet에 로그 데이터를 보내도록 rsyslog-client를 구성합니다.

Ubuntu의 기본 rsyslog 설정에서 /etc/rsyslog.d에 두 개의 파일이 있습니다.

  • 20-ufw.conf
  • 50-default.conf

rsyslog-client에서 기본 구성 파일을 편집합니다.

  1. sudo nano /etc/rsyslog.d/50-default.conf

log by facility 섹션 앞의 파일 상단에 다음 줄을 추가하고 private_ip_of_ryslog_server중앙 집중식 서버의 개인 IP로 바꿉니다. 서버:

*.*							@private_ip_of_ryslog_server:514

파일을 저장하고 종료합니다.

줄의 첫 번째 부분(.)은 모든 메시지를 보내고 싶다는 의미입니다. 이 자습서의 범위를 벗어나는 동안 특정 메시지만 보내도록 rsyslog를 구성할 수 있습니다. 줄의 나머지 부분에서는 데이터를 보내는 방법과 데이터를 보낼 위치를 설명합니다. 우리의 경우 IP 주소 앞의 @ 기호는 rsyslog에 UDP를 사용하여 메시지를 보내도록 지시합니다. TCP를 사용하려면 이것을 @@로 변경하십시오. 그 다음에는 rsyslog 및 Logstash가 설치된 rsyslog-server의 사설 IP 주소가 옵니다. 콜론 뒤의 숫자는 사용할 포트 번호입니다.

변경 사항을 활성화하려면 rsyslog를 다시 시작하십시오.

  1. sudo service rsyslog restart

축하해요! 이제 syslog 메시지를 중앙 집중식 서버로 보내고 있습니다!

팁: rsyslog 구성 파일의 유효성을 검사하려면 sudo rsyslogd -N1 명령을 실행할 수 있습니다.

5단계 - 로그 데이터를 JSON으로 형식 지정

Elasticsearch는 수신하는 모든 문서가 JSON 형식이어야 하며 rsyslog는 템플릿을 통해 이를 수행할 수 있는 방법을 제공합니다.

이 단계에서는 중앙 집중식 rsyslog 서버를 구성하여 JSON 템플릿을 사용하여 로그 데이터를 Logstash로 보내기 전에 형식을 지정한 다음 다른 서버의 Elasticsearch로 보냅니다.

rsyslog-server 서버로 돌아가 Logstash로 보내기 전에 메시지를 JSON 형식으로 형식화하는 새 구성 파일을 생성합니다.

  1. sudo nano /etc/rsyslog.d/01-json-template.conf

다음 내용을 표시된 대로 정확하게 파일에 복사합니다.

template(name="json-template"
  type="list") {
    constant(value="{")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"@version\":\"1")
      constant(value="\",\"message\":\"")     property(name="msg" format="json")
      constant(value="\",\"sysloghost\":\"")  property(name="hostname")
      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
      constant(value="\",\"programname\":\"") property(name="programname")
      constant(value="\",\"procid\":\"")      property(name="procid")
    constant(value="\"}\n")
}

첫 번째와 마지막을 제외하고 이 템플릿에 의해 생성된 줄의 시작 부분에 쉼표가 있음에 유의하십시오. 이는 JSON 구조를 유지하고 모든 것을 깔끔하게 정렬하여 파일을 읽을 수 있도록 유지하기 위한 것입니다. 이 템플릿은 Elasticsearch와 Logstash가 수신할 것으로 예상하는 방식으로 메시지 형식을 지정합니다. 다음과 같이 표시됩니다.

{
  "@timestamp" : "2015-11-18T18:45:00Z",
  "@version" : "1",
  "message" : "Your syslog message here",
  "sysloghost" : "hostname.example.com",
  "severity" : "info",
  "facility" : "daemon",
  "programname" : "my_program",
  "procid" : "1234"
}

팁: rsyslog.com 문서는 로그 데이터를 사용자 지정하려는 경우 rsyslog에서 사용할 수 있는 변수를 보여줍니다. 그러나 JSON 형식으로 Logstash로 보낸 다음 Elasticsearch로 보내야 합니다.

전송 중인 데이터는 아직 이 형식을 사용하지 않습니다. 다음 단계는 이 템플릿 파일을 사용하도록 서버를 구성하는 것입니다.

6단계 - Logstash로 전송하도록 중앙 집중식 서버 구성

이제 적절한 JSON 형식을 정의하는 템플릿 파일이 있으므로 이 튜토리얼의 동일한 Droplet에 있는 Logstash로 데이터를 보내도록 중앙 집중식 rsyslog 서버를 구성하겠습니다.

시작할 때 rsyslog는 /etc/rsyslog.d의 파일을 살펴보고 여기에서 구성을 만듭니다. 구성을 확장하기 위해 자체 구성 파일을 추가해 보겠습니다.

rsyslog-server에서 /etc/rsyslog.d/60-output.conf를 만듭니다.

  1. sudo nano /etc/rsyslog.d/60-output.conf

다음 줄을 이 파일에 복사합니다.

# This line sends all lines to defined IP address at port 10514,
# using the "json-template" format template

*.*							@private_ip_logstash:10514;json-template

시작 부분의 *.*는 모든 로그 메시지에 대해 나머지 행을 처리한다는 의미입니다. @ 기호는 UDP 사용을 의미합니다(대신 TCP를 사용하려면 @@ 사용). @ 뒤의 IP 주소 또는 호스트 이름은 메시지를 전달할 위치입니다. 우리의 경우 rsyslog 중앙 집중식 서버와 Logstash 서버가 동일한 Droplet에 설치되어 있으므로 rsyslog-server의 사설 IP 주소를 사용하고 있습니다. 이는 다음 단계에서 수신 대기하도록 Logstash를 구성한 사설 IP 주소와 일치해야 합니다.

다음은 포트 번호입니다. 이 자습서에서는 포트 10514를 사용합니다. Logstash 서버는 동일한 프로토콜을 사용하여 동일한 포트에서 수신 대기해야 합니다. 마지막 부분은 데이터를 전달하기 전에 형식을 지정하는 방법을 보여주는 템플릿 파일입니다.

아직 rsyslog를 다시 시작하지 마십시오. 먼저 메시지를 수신하도록 Logstash를 구성해야 합니다.

7단계 - JSON 메시지를 수신하도록 Logstash 구성

이 단계에서는 Logstash를 설치하고 rsyslog에서 JSON 메시지를 수신하도록 구성하고 JSON 메시지를 Elasticsearch로 보내도록 구성합니다.

Logstash에는 Java 7 이상이 필요합니다. Elasticsearch 자습서의 1단계 지침을 사용하여 rsyslog-server Droplet에 Java 7 또는 8을 설치합니다.

다음으로 Logstash 리포지토리의 보안 키를 설치합니다.

  1. wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

/etc/apt/sources.list 파일에 리포지토리 정의를 추가합니다.

  1. echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list

참고: 위에서 설명한 echo 메서드를 사용하여 Logstash 저장소를 추가하세요. add-apt-repository를 사용하지 마십시오. deb-src 항목도 추가되지만 Elastic은 소스 패키지를 제공하지 않습니다. apt-get update를 실행하려고 하면 오류가 발생합니다.

Logstash 리포지토리를 포함하도록 패키지 목록을 업데이트합니다.

  1. sudo apt-get update

마지막으로 Logstash를 설치합니다.

  1. sudo apt-get install logstash

이제 Logstash가 설치되었으므로 rsyslog에서 메시지를 수신하도록 구성하겠습니다.

Logstash의 기본 설치는 /etc/logstash/conf.d에서 구성 파일을 찾습니다. 기본 구성 파일을 편집합니다.

  1. sudo nano /etc/logstash/conf.d/logstash.conf

그런 다음 다음 줄을 /etc/logstash/conf.d/logstash.conf에 추가합니다.

# This input block will listen on port 10514 for logs to come in.
# host should be an IP on the Logstash server.
# codec => "json" indicates that we expect the lines we're receiving to be in JSON format
# type => "rsyslog" is an optional identifier to help identify messaging streams in the pipeline.

input {
  udp {
    host => "logstash_private_ip"
    port => 10514
    codec => "json"
    type => "rsyslog"
  }
}

# This is an empty filter block.  You can later add other filters here to further process
# your log lines

filter { }

# This output block will send all events of type "rsyslog" to Elasticsearch at the configured
# host and port into daily indices of the pattern, "rsyslog-YYYY.MM.DD"

output {
  if [type] == "rsyslog" {
    elasticsearch {
      hosts => [ "elasticsearch_private_ip:9200" ]
    }
  }
}

syslog 프로토콜은 정의상 UDP이므로 이 구성은 해당 표준을 미러링합니다.

입력 블록에서 logstash_private_ip를 Logstash가 설치된 rsyslog-server의 사설 IP 주소로 대체하여 Logstash 호스트 주소를 설정합니다.

입력 블록은 포트 10514에서 수신 대기하도록 Logstash를 구성하므로 동일한 시스템의 syslog 인스턴스와 경쟁하지 않습니다. 1024 미만의 포트는 Logstash를 루트로 실행해야 하며 이는 좋은 보안 관행이 아닙니다.

elasticsearch_private_ip를 Elasticsearch Droplet의 사설 IP 주소로 바꿔야 합니다. 출력 블록은 간단한 조건부 구성을 보여줍니다. 그 목적은 일치하는 이벤트만 허용하는 것입니다. 이 경우에는 "rsyslog\의 "유형\이 있는 이벤트만 해당됩니다.

Logstash 구성 변경 사항을 테스트합니다.

  1. sudo service logstash configtest

구문 오류가 없으면 구성 확인이 표시되어야 합니다. 그렇지 않으면 오류 출력을 읽고 Logstash 구성에 어떤 문제가 있는지 확인하십시오.

이 모든 단계가 완료되면 다음을 실행하여 Logstash 인스턴스를 시작할 수 있습니다.

  1. sudo service logstash start

또한 지금 전달할 Logstash 인스턴스가 있으므로 동일한 서버에서 rsyslog를 다시 시작하십시오.

  1. sudo service rsyslog restart

Logstash가 포트 10514에서 수신 대기하는지 확인하려면:

  1. netstat -na | grep 10514

다음과 같은 내용이 표시되어야 합니다.

udp6       0      0 10.128.33.68:10514     :::*  

rsyslog-server의 개인 IP 주소와 rsyslog 데이터를 수신하는 데 사용하는 10514 포트 번호가 표시됩니다.

팁: Logstash 문제를 해결하려면 sudo service logstash stop을 사용하여 서비스를 중지하고 자세한 메시지와 함께 포그라운드에서 실행하십시오.

  1. /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --verbose

여기에는 Logstash가 사용하는 IP 주소 및 UDP 포트 확인과 같은 일반적인 정보가 포함됩니다.

Starting UDP listener {:address=>"10.128.33.68:10514", :level=>:info}

8단계 - Elasticsearch 입력 확인

이전에는 개인 IP 주소에서 수신 대기하도록 Elasticsearch를 구성했습니다. 이제 Logstash에서 메시지를 수신해야 합니다. 이 단계에서는 Elasticsearch가 로그 데이터를 수신하는지 확인합니다.

rsyslog-client 및 rsyslog-server Droplet은 모든 로그 데이터를 Logstash로 전송한 다음 Elasticsearch로 전달해야 합니다. Elasticsearch가 실제로 이러한 메시지를 수신하고 있는지 확인하기 위해 보안 메시지를 생성해 보겠습니다.

rsyslog-client에서 다음 명령을 실행합니다.

  1. sudo tail /var/log/auth.log

출력 끝에 로컬 시스템의 보안 로그가 표시됩니다. 다음과 유사하게 표시됩니다.

May  2 16:43:15 rsyslog-client sudo:    sammy : TTY=pts/0 ; PWD=/etc/rsyslog.d ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
May  2 16:43:15 rsyslog-client sudo: pam_unix(sudo:session): session opened for user root by sammy(uid=0)

간단한 쿼리로 Elasticsearch를 확인할 수 있습니다.

Elasticsearch 서버 또는 액세스가 허용된 시스템에서 다음 명령을 실행합니다. elasticsearch_ip를 Elasticsearch 서버의 사설 IP 주소로 바꿉니다. 이 IP 주소는 또한 이 자습서의 앞부분에서 수신 대기하도록 Elasticsearch를 구성한 주소여야 합니다.

  1. curl -XGET 'http://elasticsearch_ip:9200/_all/_search?q=*&pretty'

출력에서 다음과 유사한 내용을 볼 수 있습니다.

{
      "_index" : "logstash-2016.05.04",
      "_type" : "rsyslog",
      "_id" : "AVR8fpR-e6FP4Elp89Ww",
      "_score" : 1.0,
      "_source":{"@timestamp":"2016-05-04T15:59:10.000Z","@version":"1","message":"    sammy : TTY=pts/0 ; PWD=/home/sammy ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log","sysloghost":"rsyslog-client","severity":"notice","facility":"authpriv","programname":"sudo","procid":"-","type":"rsyslog","host":"10.128.33.68"}
    },

rsyslog 메시지를 생성한 Droplet의 이름은 로그(rsyslog-client)에 있습니다.

이 간단한 확인 단계를 통해 중앙 집중식 rsyslog 설정이 완료되고 완벽하게 작동합니다!

결론

이제 로그가 Elasticsearch에 있습니다. 무엇 향후 계획? Logstash 및 Kibana를 사용하여 Ubuntu 14.04에서 로그를 중앙 집중화하는 방법에서 Kibana 웹 인터페이스를 사용하여 로그를 검색하고 시각화하는 방법을 읽어보십시오.

추가 구문 분석 및 토큰화를 통해 데이터의 가치가 더 높아질 수 있습니다. 그렇다면 Logstash에 대해 자세히 알아보면 해당 결과를 달성하는 데 도움이 될 것입니다.