Utilice las mejores prácticas de CI/CD para automatizar las operaciones de administración de clústeres de Amazon OpenSearch Service

Como
Gustó

Fecha:

Nodo: 4207669

El acceso rápido y confiable a la información es crucial para tomar decisiones comerciales inteligentes. Es por eso que las empresas están recurriendo a Servicio Amazon OpenSearch para potenciar sus capacidades de búsqueda y análisis. OpenSearch Service facilita la implementación, el funcionamiento y la ampliación de los sistemas de búsqueda en la nube, lo que permite casos de uso como el análisis de registros, el monitoreo de aplicaciones y la búsqueda en sitios web.

La gestión eficiente de los índices y los recursos de clúster de OpenSearch Service puede generar mejoras significativas en el rendimiento, la escalabilidad y la confiabilidad, todo lo cual afecta directamente los resultados de una empresa. Sin embargo, la industria carece de soluciones integradas y bien documentadas para automatizar estas importantes tareas operativas.

La aplicación de la integración continua y la implementación continua (CI/CD) a la gestión de los recursos de índice de OpenSearch puede ayudar a lograrlo. Por ejemplo, el almacenamiento de las configuraciones de índice en un repositorio de origen permite un mejor seguimiento, colaboración y recuperación. El uso de herramientas de infraestructura como código (IaC) puede ayudar a automatizar la creación de recursos, lo que proporciona coherencia y reduce el trabajo manual. Por último, el uso de una canalización de CI/CD puede automatizar las implementaciones y optimizar el flujo de trabajo.

En este post comentamos dos opciones para conseguirlo: la Proveedor de Terraform OpenSearch y la Evolución biblioteca. La que mejor se adapta a su caso de uso depende de las herramientas con las que esté familiarizado, el lenguaje que elija y su flujo de trabajo existente.

Resumen de la solución

Veamos una implementación sencilla. Para este caso de uso, utilizamos el Kit de desarrollo en la nube de AWS (AWS CDK) para aprovisionar la infraestructura relevante como se describe en el siguiente diagrama de arquitectura que aparece a continuación, AWS Lambda para activar scripts de Evolution y Construcción de código AWS para aplicar archivos Terraform. Puedes encontrar el código de la solución completa en GitHub repo.

Diagrama de la arquitectura de la solución

Requisitos previos

Para seguir este post necesitas tener lo siguiente:

Construir la solución

Para crear una solución automatizada para la gestión de clústeres de OpenSearch Service, siga estos pasos:

  1. Ingrese los siguientes comandos en una terminal para descargar el código de la solución; crear la aplicación Java; crear la capa Lambda requerida; crear un dominio OpenSearch, dos funciones Lambda y un proyecto CodeBuild; e implementar el código:
git clone https://github.com/aws-samples/opensearch-automated-cluster-management
cd opensearch-automated-cluster-management
cd app/openSearchMigration
mvn package
cd ../../lambda_layer
chmox a+x create_layer.sh
./create_layer.sh
cd ../infra
npm install
npx cdk bootstrap
aws iam create-service-linked-role --aws-service-name es.amazonaws.com
npx cdk deploy --require-approval never

  1. Espere entre 15 y 20 minutos para que la infraestructura termine de implementarse, luego verifique que su dominio OpenSearch esté en funcionamiento y que se hayan creado la función Lambda y el proyecto CodeBuild, como se muestra en las siguientes capturas de pantalla.

El dominio OpenSearch se aprovisionó correctamente Función Lambda de migración de OpenSearch creada correctamente Función Lambda OpenSearchQuery creada correctamente Proyecto CodeBuild creado exitosamente

Antes de utilizar herramientas automatizadas para crear plantillas de índice, puede verificar que no exista ninguna utilizando el OpenSearchQuery Función lambda.

  1. En la consola Lambda, navegue hasta la sección correspondiente. Función
  2. En la pestaña Prueba pestaña, elegir Prueba.

La función debería devolver el mensaje “No hay patrones de índice creados por Terraform o Evolution”, como se muestra en la siguiente captura de pantalla.

Compruebe que no se hayan creado patrones de índice

Aplicar archivos Terraform

Primero, use Terraform con CodeBuild. El código está listo para que lo pruebe. Veamos algunos elementos importantes de la configuración:

  1. Define las variables necesarias para tu entorno:
variable "OpenSearchDomainEndpoint" {
  type = string
  description = "OpenSearch domain URL"
}

variable "IAMRoleARN" {
  type = string
  description = "IAM Role ARN to interact with OpenSearch"
}

  1. Definir y configurar el proveedor
terraform {
  required_providers {
    opensearch = {
      source = "opensearch-project/opensearch"
      version = "2.3.1"
    }
  }
}

provider "opensearch" {
  url = "https://${var.OpenSearchDomainEndpoint}"
  aws_assume_role_arn = "${var.IAMRoleARN}"
}

NOTA:A la fecha de publicación de este post, hay una error en el proveedor Terraform OpenSearch que se activará al iniciar su proyecto CodeBuild y que impedirá la ejecución exitosa. Hasta que se solucione, utilice la siguiente versión:

terraform {
  required_providers {
    opensearch = {
      source = "gnuletik/opensearch"
      version = "2.7.0"
    }
  }
}

  1. Crear una plantilla de índice
resource "opensearch_index_template" "template_1" {
  name = "cicd_template_terraform"
  body = <<EOF
{
  "index_patterns": ["terraform_index_*"],
  "template": {
    "settings": {
      "number_of_shards": "1"
    },
    "mappings": {
        "_source": {
            "enabled": false
        },
        "properties": {
            "host_name": {
                "type": "keyword"
            },
            "created_at": {
                "type": "date",
                "format": "EEE MMM dd HH:mm:ss Z YYYY"
            }
        }
    }
  }
}
EOF
}

Ahora está listo para realizar la prueba.

  1. En la consola CodeBuild, navegue hasta el Proyecto relevante y elija Iniciar compilación.

La compilación debería completarse correctamente y debería ver las siguientes líneas en los registros:

opensearch_index_template.template_1: Creating...
opensearch_index_template.template_1: Creation complete after 0s (id=cicd_template_terraform)
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Puede comprobar que la plantilla de índice se ha creado correctamente utilizando la misma función Lambda que anteriormente y debería ver los siguientes resultados.

Índice Terraform creado correctamente

Ejecutar scripts de Evolution

En el siguiente paso, se utiliza la biblioteca Evolution. El código está listo para que lo pruebes. Veamos algunos fragmentos importantes de código y configuración:

  1. Para comenzar, debe agregar la última versión de la biblioteca principal Evolution y el SDK de AWS como dependencias de Maven. El archivo xml completo está disponible en GitHub repositorio; para comprobar la compatibilidad de la biblioteca Evolution con diferentes versiones de OpenSearch, consulte aquí.
<dependency>
    <groupId>com.senacor.elasticsearch.evolution</groupId>
    <artifactId>elasticsearch-evolution-core</artifactId>
    <version>0.6.0</version><!--check the latest version-->
</dependency>
<dependency>
   <groupId>software.amazon.awssdk</groupId>
   <artifactId>auth</artifactId>
</dependency>

  1. Cree un Evolution Bean y un interceptor de AWS (que implementa HttpRequestInterceptor).

Los interceptores son mecanismos abiertos en los que el SDK llama al código que escribes para inyectar comportamiento en el ciclo de vida de la solicitud y la respuesta. La función del interceptor de AWS es conectarse a la ejecución de solicitudes de API y crear una solicitud firmada por AWS con los roles de IAM adecuados. Puedes usar lo siguiente código para crear su propia implementación para firmar todas las solicitudes realizadas a OpenSearch dentro de AWS.

  1. Cree su propio cliente OpenSearch para administrar la creación automática de índices, asignaciones, plantillas y alias.

El cliente ElasticSearch predeterminado que viene incluido como parte de la dependencia de Maven no se puede usar para realizar PUT llamadas al clúster OpenSearch. Por lo tanto, debe omitir la instancia de cliente REST predeterminada y agregar una CallBack En el correo electrónico “Su Cuenta de Usuario en su Nuevo Sistema XNUMXCX”. AwsRequestSigningInterceptor.

A continuación se muestra un ejemplo de implementación:

private RestClient getOpenSearchEvolutionRestClient() {
    return RestClient.builder(getHttpHost())
        .setHttpClientConfigCallback(hacb -> 
            hacb.addInterceptorLast(getAwsRequestSigningInterceptor()))
        .build();
}

  1. Utilice Evolution Bean para llamar a su método de migración, que es responsable de iniciar la migración de los scripts definidos mediante classpath or filepath:
public void executeOpensearchScripts() {
    ElasticsearchEvolution opensearchEvolution = ElasticsearchEvolution.configure()
        .setEnabled(true) // true or false
        .setLocations(Arrays.asList("classpath:opensearch_migration/base",
            "classpath:opensearch_migration/dev")) // List of all locations where scripts are located.
        .setHistoryIndex("opensearch_changelog") // Tracker index to store history of scripts executed.
        .setValidateOnMigrate(false) // true or false
        .setOutOfOrder(true) // true or false
        .setPlaceholders(Collections.singletonMap("env","dev")) // list of placeholders which will get replaced in the script during execution.
        .load(getElasticsearchEvolutionRestClient());
    opensearchEvolution.migrate();
}

  1. An Evolution El script de migración representa una llamada REST a la API de OpenSearch (por ejemplo, PUT /_index_template/cicd_template_evolution), donde se definen patrones de índice, configuraciones y asignaciones en formato JSON. Evolution interpreta estos scripts, administra sus versiones y proporciona una ejecución ordenada. Vea el siguiente ejemplo:
PUT /_index_template/cicd_template_evolution
Content-Type: application/json

{
  "index_patterns": ["evolution_index_*"],
  "template": {
    "settings": {
      "number_of_shards": "1"
    },
    "mappings": {
        "_source": {
            "enabled": false
        },
        "properties": {
            "host_name": {
                "type": "keyword"
            },
            "created_at": {
                "type": "date",
                "format": "EEE MMM dd HH:mm:ss Z YYYY"
            }
        }
    }
  }
}

Las dos primeras líneas Debe ir seguido de una línea en blanco.. Evolution También admite líneas de comentarios en sus scripts de migración. Cada línea que comience con # or // se interpretará como una línea de comentario. Las líneas de comentario no se envían a OpenSearch, sino que Evolution las filtra.

La convención de nombres de archivos del script de migración debe seguir un patrón:

  • Comience con esMigrationPrefix que es por defecto V o el valor que se ha configurado mediante la opción de configuración esMigrationPrefix
  • Seguido de un número de versión, que debe ser numérico y puede estructurarse separando las partes de la versión con un punto (.)
  • Seguido por el versionDescriptionSeparator: __ (el símbolo de doble subrayado)
  • Seguido de una descripción, que puede ser cualquier texto que admita su sistema de archivos.
  • Terminar con esMigrationSuffixes que es por defecto .http y es configurable y no distingue entre mayúsculas y minúsculas

Ahora está listo para ejecutar su primer cambio automatizado. Ya se ha creado un ejemplo de un script de migración, al que puede hacer referencia en una sección anterior. Creará una plantilla de índice denominada cicd_template_evolution.

  1. En la consola de Lambda, navegue hasta su función.
  2. En la pestaña Prueba pestaña, elegir Prueba.

Después de unos segundos, la función debería completarse correctamente. Puede revisar el resultado del registro en el Detalles sección, como se muestra en las siguientes capturas de pantalla.

La función de migración finalizó con éxito

La plantilla de índice ahora existe y puedes comprobar que su configuración está realmente en línea con el script, como se muestra en la siguiente captura de pantalla.

Plantilla de índice de evolución creada correctamente

Limpiar

Para limpiar los recursos que se crearon como parte de esta publicación, ejecute los siguientes comandos (en el infra carpeta):

npx cdk destroy --all

Conclusión

En esta publicación, demostramos cómo automatizar las plantillas de índice de OpenSearch utilizando prácticas y herramientas de CI/CD como Terraform o la biblioteca Evolution.

Para obtener más información sobre el servicio OpenSearch, consulte Guía para desarrolladores del servicio Amazon OpenSearchPara explorar más a fondo la biblioteca Evolution, consulte la documentaciónPara obtener más información sobre el proveedor Terraform OpenSearch, consulte documentación.

Esperamos que esta guía detallada y el código que la acompaña te ayuden a comenzar. ¡Pruébala, cuéntanos qué te parece en la sección de comentarios y no dudes en comunicarte con nosotros si tienes preguntas!


Acerca de los autores

Camille BirbesCamille Birbes Camille es arquitecto de soluciones sénior en AWS y reside en Hong Kong. Trabaja con importantes instituciones financieras para diseñar y crear soluciones seguras, escalables y de alta disponibilidad en la nube. Fuera del trabajo, a Camille le gustan todo tipo de juegos, desde juegos de mesa hasta los videojuegos más recientes.

Sri Harsha Subramanya Begolli Trabaja como arquitecto de soluciones sénior en AWS, con sede en Bengaluru, India. Su principal objetivo es ayudar a grandes empresas a modernizar sus aplicaciones y desarrollar sistemas basados ​​en la nube para cumplir con sus objetivos comerciales. Su experiencia se centra en los ámbitos de los datos y el análisis.

Artículos relacionados

punto_img

Artículos Recientes

punto_img