다음을 통해 공유


Azure VM에 ELK(Elastic Stack) 설치

적용 대상: ✔️ Linux VM ✔️ 유연한 확장 집합

이 문서에서는 Azure의 Ubuntu VM에 Elasticsearch, LogstashKibana를 배포하는 방법을 안내합니다. 탄력적 스택의 작동을 확인하려면 선택적으로 Kibana에 연결하고 일부 샘플 로깅 데이터를 사용할 수 있습니다.

또한 Azure Virtual Machines에 Elastic 배포 모듈을 따라 Azure Virtual Machines에 Elastic 을 배포하는 방법에 대한 자세한 자습서를 확인할 수 있습니다.

이 자습서에서는 다음 방법을 알아봅니다.

  • Azure 리소스 그룹에서 Ubuntu VM 만들기
  • VM에 Elasticsearch, Logstash 및 Kibana 설치
  • Logstash를 사용하여 Elasticsearch에 샘플 데이터 보내기
  • Kibana 콘솔에서 포트 열기 및 데이터 작업

이 배포는 Elastic Stack을 사용한 기본 개발에 적합합니다. 프로덕션 환경에 대한 권장 사항을 포함하여 Elastic Stack에 대한 자세한 내용은 Elastic 설명서Azure 아키텍처 센터를 참조하세요.

필수 조건

  • 이 문서에는 Azure CLI 버전 2.0.4 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.

리소스 그룹 만들기

이 섹션에서는 환경 변수가 후속 명령에서 사용하도록 선언됩니다. 고유성을 위해 리소스 이름에 임의 접미사가 추가됩니다.

export RANDOM_SUFFIX=$(openssl rand -hex 3)
export RESOURCE_GROUP="myResourceGroup$RANDOM_SUFFIX"
export REGION="eastus2"
az group create --name $RESOURCE_GROUP --location $REGION

결과:

{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxxxxx",
  "location": "eastus",
  "managedBy": null,
  "name": "myResourceGroupxxxxxx",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

가상 머신 만들기

이 섹션에서는 고유한 이름을 가진 VM을 만들고 SSH 키가 아직 없는 경우 SSH 키를 생성합니다. 고유성을 보장하기 위해 임의 접미사가 추가됩니다.

export VM_NAME="myVM$RANDOM_SUFFIX"
az vm create \
    --resource-group $RESOURCE_GROUP \
    --name $VM_NAME \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys

VM이 만들어지면 Azure CLI는 다음 예제와 유사한 정보를 표시합니다. publicIpAddress를 기록해 둡다. 이 주소는 VM에 액세스하는 데 사용됩니다.

결과:

{
  "fqdns": "",
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachines/myVMxxxxxx",
  "location": "eastus",
  "macAddress": "xx:xx:xx:xx:xx:xx",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "x.x.x.x",
  "resourceGroup": "$RESOURCE_GROUP"
}

VM에 SSH 수행

VM의 공용 IP 주소를 아직 모르는 경우 다음 명령을 실행하여 나열합니다.

az network public-ip list --resource-group $RESOURCE_GROUP --query [].ipAddress

다음 명령을 사용하여 가상 머신으로 SSH 세션을 만듭니다. 가상 머신의 올바른 공용 IP 주소를 대체합니다. 이 예제에서 IP 주소는 40.68.254.142입니다.

export PUBLIC_IP_ADDRESS=$(az network public-ip list --resource-group $RESOURCE_GROUP --query [].ipAddress -o tsv)

탄력적 스택 설치

이 섹션에서는 Elasticsearch 서명 키를 가져오고 Elastic 패키지 리포지토리를 포함하도록 APT 원본 목록을 업데이트합니다. 그 다음에는 Elastic Stack 구성 요소에 필요한 Java 런타임 환경을 설치합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
"

VM에 Java Virtual Machine을 설치하고 JAVA_HOME 변수를 구성합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sudo apt install -y openjdk-8-jre-headless
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
"

다음 명령을 실행하여 Ubuntu 패키지 원본을 업데이트하고 Elasticsearch, Kibana 및 Logstash를 설치합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
  wget -qO elasticsearch.gpg https://artifacts.elastic.co/GPG-KEY-elasticsearch
  sudo mv elasticsearch.gpg /etc/apt/trusted.gpg.d/

  echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

  sudo apt update
  
  # Now install the ELK stack
  sudo apt install -y elasticsearch kibana logstash
"

비고

디렉터리 레이아웃 및 초기 구성을 포함한 자세한 설치 지침은 Elastic의 설명서에서 유지 관리됩니다.

Elasticsearch 시작

다음 명령을 사용하여 VM에서 Elasticsearch를 시작합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sudo systemctl start elasticsearch.service
"

이 명령은 출력을 생성하지 않으므로 Elasticsearch가 이 curl 명령을 사용하여 VM에서 실행되고 있는지 확인합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sleep 11
sudo curl -XGET 'localhost:9200/'
"

Elasticsearch가 실행 중인 경우 다음과 같은 출력이 표시됩니다.

결과:

{
  "name" : "w6Z4NwR",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "SDzCajBoSK2EkXmHvJVaDQ",
  "version" : {
    "number" : "5.6.3",
    "build_hash" : "1a2f265",
    "build_date" : "2017-10-06T20:33:39.012Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}

Logstash를 시작하고 Elasticsearch에 데이터 추가

다음 명령을 사용하여 Logstash를 시작합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sudo systemctl start logstash.service
"

Logstash를 테스트하여 올바르게 작동하는지 확인합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
# Time-limited test with file input instead of stdin
sudo timeout 11s /usr/share/logstash/bin/logstash -e 'input { file { path => "/var/log/syslog" start_position => "end" sincedb_path => "/dev/null" stat_interval => "1 second" } } output { stdout { codec => json } }' || echo "Logstash test completed"
"

표준 입력을 표준 출력으로 출력하는 기본 Logstash 파이프라인입니다.

이 VM에서 Elasticsearch로 커널 메시지를 전달하도록 Logstash를 설정합니다. Logstash 구성 파일을 만들려면 vm-syslog-logstash.conf라는 새 파일에 구성을 쓰는 다음 명령을 실행합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
cat << 'EOF' > vm-syslog-logstash.conf
input {
    stdin {
        type => "stdin-type"
    }

    file {
        type => "syslog"
        path => [ "/var/log/*.log", "/var/log/*/*.log", "/var/log/messages", "/var/log/syslog" ]
        start_position => "beginning"
    }
}

output {

    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts  => "localhost:9200"
    }
}
EOF
"

이 구성을 테스트하고 Syslog 데이터를 Elasticsearch로 보냅니다.

# Run Logstash with the configuration for 60 seconds
sudo timeout 60s /usr/share/logstash/bin/logstash -f vm-syslog-logstash.conf &
LOGSTASH_PID=$!

# Wait for data to be processed
echo "Processing logs for 60 seconds..."
sleep 65

# Verify data was sent to Elasticsearch with proper error handling
echo "Verifying data in Elasticsearch..."
ES_COUNT=$(sudo curl -s -XGET 'localhost:9200/_cat/count?v' | tail -n 1 | awk '{print $3}' 2>/dev/null || echo "0")

# Make sure ES_COUNT is a number or default to 0
if ! [[ "$ES_COUNT" =~ ^[0-9]+$ ]]; then
    ES_COUNT=0
    echo "Warning: Could not get valid document count from Elasticsearch"
fi

echo "Found $ES_COUNT documents in Elasticsearch"

if [ "$ES_COUNT" -gt 0 ]; then
    echo "✅ Logstash successfully sent data to Elasticsearch"
else
    echo "❌ No data found in Elasticsearch, there might be an issue with Logstash configuration"
fi

터미널에서 syslog 항목이 Elasticsearch로 전송될 때 에코되는 것을 볼 수 있습니다. 일부 데이터를 보낸 후 Ctrl+C를 사용하여 Logstash에서 종료합니다.

Kibana를 시작하고 Elasticsearch에서 데이터 시각화

Kibana 구성 파일(/etc/kibana/kibana.yml)을 편집하고 Kibana가 수신 대기하는 IP 주소를 변경하여 웹 브라우저에서 액세스할 수 있습니다.

server.host: "0.0.0.0"

다음 명령을 사용하여 Kibana를 시작합니다.

ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sudo systemctl start kibana.service
"

Azure CLI에서 포트 5601을 열어 Kibana 콘솔에 대한 원격 액세스를 허용합니다.

az vm open-port --port 5601 --resource-group $RESOURCE_GROUP --name $VM_NAME

다음 단계

이 자습서에서는 Elastic Stack을 Azure의 개발 VM에 배포했습니다. 당신은 다음을 배우셨습니다:

  • Azure 리소스 그룹에서 Ubuntu VM 만들기
  • VM에 Elasticsearch, Logstash 및 Kibana 설치
  • Logstash에서 Elasticsearch로 샘플 데이터 보내기
  • Kibana 콘솔에서 포트 열기 및 데이터 작업