Compartir a través de


Instalación de Elastic Stack (ELK) en una máquina virtual de Azure

Se aplica a: ✔️ Máquinas virtuales Linux ✔️ Conjuntos de escalado flexibles

En este artículo se le guiará acerca de cómo implementar Elasticsearch, Logstash y Kibana en una máquina virtual con Ubuntu en Azure. Para ver Elastic Stack en acción, puede conectarse opcionalmente a Kibana y trabajar con algunos de los datos de registro de ejemplo.

Además, puede seguir el módulo Implementación de Elastic en Azure Virtual Machines para ver un tutorial más guiado sobre la implementación de Elastic en Azure Virtual Machines.

En este tutorial, aprenderá a:

  • Crear una máquina virtual con Ubuntu en un grupo de recursos de Azure
  • Instalar Elasticsearch, Logstash y Kibana en la máquina virtual
  • Enviar datos de ejemplo a Elasticsearch con Logstash
  • Abrir los puertos y trabajar con datos en la consola de Kibana

Esta implementación es adecuada para el desarrollo básico con Elastic Stack. Para más información acerca de Elastic Stack, incluidas recomendaciones para un entorno de producción, consulte la documentación de Elastic y Azure Architecture Center.

Requisitos previos

  • En este artículo se necesita la versión 2.0.4 de la CLI de Azure, o cualquier versión posterior. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.

Crear un grupo de recursos

En esta sección, las variables de entorno se declaran para su uso en comandos posteriores. Se anexa un sufijo aleatorio a los nombres de recursos para la unicidad.

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

Resultados:

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

Creación de una máquina virtual

En esta sección se crea una máquina virtual con un nombre único, al tiempo que también se generan claves SSH si aún no existen. Se anexa un sufijo aleatorio para garantizar la unicidad.

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

Cuando se ha creado la máquina virtual, la CLI de Azure muestra información similar al ejemplo siguiente. Tome nota de la dirección IP pública. Esta dirección se utiliza para tener acceso a la máquina virtual.

Resultados:

{
  "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"
}

Conexión SSH con la máquina virtual

Si aún no conoce la dirección IP pública de la máquina virtual, ejecute el siguiente comando para enumerarlo:

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

Ejecute el comando siguiente para crear una sesión SSH con la máquina virtual. Sustituya la dirección IP pública correcta de la máquina virtual. En este ejemplo, la dirección IP es 40.68.254.142.

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

Instalación de Elastic Stack

En esta sección, importa la clave de firma de Elasticsearch y actualiza la lista de orígenes de APT para incluir el repositorio de paquetes de Elastic. Esto va seguido de la instalación del entorno de tiempo de ejecución de Java que es necesario para los componentes de Elastic Stack.

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
"

Instale la máquina virtual Java en la máquina virtual y configure la variable 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
"

Ejecute el siguiente comando para actualizar los orígenes de paquetes de Ubuntu e instalar Elasticsearch, Kibana y 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
"

Nota

Las instrucciones de instalación detalladas, incluidos los diseños de directorio y la configuración inicial, se incluyen en la documentación de Elastic

Iniciar Elasticsearch

Inicie Elasticsearch en la máquina virtual con el siguiente comando:

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

Este comando no genera ninguna salida, por lo que debe comprobar que Elasticsearch se está ejecutando en la máquina virtual con este comando curl:

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

Si Elasticsearch se está ejecutando, verá un resultado similar al siguiente:

Resultados:

{
  "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"
}

Iniciar Logstash y agregar datos a Elasticsearch

Inicie Logstash con el siguiente comando:

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

Pruebe Logstash para asegurarse de que funciona correctamente:

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"
"

Se trata de una canalización básica de Logstash que repite la entrada estándar en la salida estándar.

Configure Logstash para reenviar los mensajes del kernel de esta máquina virtual a Elasticsearch. Para crear el archivo de configuración de Logstash, ejecute el siguiente comando que escribe la configuración en un nuevo archivo denominado 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
"

Pruebe esta configuración y envíe los datos de Syslog a 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

Verá las entradas de Syslog de su terminal repetidas cuando se envíen a Elasticsearch. Use CTRL+C para salir de Logstash una vez que haya enviado algunos datos.

Inicie Kibana y visualice los datos en Elasticsearch

Edite el archivo de configuración de Kibana (/etc/kibana/kibana.yml) y cambie la dirección IP en la que escucha Kibana para que pueda acceder a él desde el explorador web:

server.host: "0.0.0.0"

Inicie Kibana con el siguiente comando:

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

Abra el puerto 5601 desde la CLI de Azure para permitir el acceso remoto a la consola de Kibana:

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

Pasos siguientes

En este tutorial, implementó Elastic Stack en una máquina virtual de desarrollo en Azure. Ha aprendido a:

  • Crear una máquina virtual con Ubuntu en un grupo de recursos de Azure
  • Instalar Elasticsearch, Logstash y Kibana en la máquina virtual
  • Enviar datos de ejemplo a Elasticsearch desde Logstash
  • Abrir los puertos y trabajar con datos en la consola de Kibana