Logotipo de Zephyrnet

Presentamos la compatibilidad con Terraform para la ingestión de Amazon OpenSearch | Servicios web de Amazon

Fecha:

Hoy lanzamos el soporte de Terraform para Ingestión de Amazon OpenSearch. Terraform es una herramienta de infraestructura como código (IaC) que le ayuda a crear, implementar y gestionar recursos en la nube de manera eficiente. OpenSearch Ingestion es un recopilador de datos sin servidor totalmente administrado que ofrece datos de seguimiento, métricas y registros en tiempo real para Servicio Amazon OpenSearch dominios y Amazon OpenSearch sin servidor colecciones. En esta publicación, explicamos cómo puede utilizar Terraform para implementar canalizaciones de ingesta de OpenSearch. Como ejemplo, utilizamos una fuente HTTP como entrada y una Servicio Amazon OpenSearch dominio (Índice) como salida.

Resumen de la solución

Los pasos de esta publicación implementan una canalización de ingesta de OpenSearch de acceso público con Terraform, junto con otros recursos de soporte necesarios para que la canalización ingiera datos en Amazon OpenSearch. Hemos implementado el Tutorial: ingesta de datos en un dominio mediante Amazon OpenSearch Ingestion, utilizando Terraform.

Creamos los siguientes recursos con Terraform:

La canalización que cree expone una fuente HTTP como entrada y un receptor de Amazon OpenSearch para guardar lotes de eventos.

Requisitos previos

Para seguir los pasos de esta publicación, necesita lo siguiente:

  • Una cuenta de AWS activa.
  • Terraform instalado en su máquina local. Para más información, ver Instalar Terraform.
  • Los permisos de IAM necesarios para crear los recursos de AWS mediante Terraform.
  • awscurl para enviar solicitudes HTTPS a través de la línea de comando con AWS Sigv4 autenticación. Para obtener instrucciones sobre cómo instalar esta herramienta, consulte la Repositorio GitHub.

Crea un directorio

En Terraform, la infraestructura se gestiona como código, llamado proyecto. Un proyecto Terraform contiene varios archivos de configuración de Terraform, como main.tf, provider.tf, variables.tfy output.df . Creemos un directorio en el servidor o máquina que podamos usar para conectarnos a los servicios de AWS usando el Interfaz de línea de comandos de AWS (CLI de AWS):

mkdir osis-pipeline-terraform-example

Cambie al directorio.

cd osis-pipeline-terraform-example

Crear la configuración de Terraform

Cree un archivo para definir los recursos de AWS.

touch main.tf

Introduzca la siguiente configuración en main.tf y guarda tu archivo:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.36"
    }
  }

  required_version = ">= 1.2.0"
}

provider "aws" {
  region = "eu-central-1"
}

data "aws_region" "current" {}
data "aws_caller_identity" "current" {}
locals {
    account_id = data.aws_caller_identity.current.account_id
}

output "ingest_endpoint_url" {
  value = tolist(aws_osis_pipeline.example.ingest_endpoint_urls)[0]
}

resource "aws_iam_role" "example" {
  name = "exampleosisrole"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "osis-pipelines.amazonaws.com"
        }
      },
    ]
  })
}

resource "aws_opensearch_domain" "test" {
  domain_name           = "osi-example-domain"
  engine_version = "OpenSearch_2.7"
  cluster_config {
    instance_type = "r5.large.search"
  }
  encrypt_at_rest {
    enabled = true
  }
  domain_endpoint_options {
    enforce_https       = true
    tls_security_policy = "Policy-Min-TLS-1-2-2019-07"
  }
  node_to_node_encryption {
    enabled = true
  }
  ebs_options {
    ebs_enabled = true
    volume_size = 10
  }
 access_policies = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "${aws_iam_role.example.arn}"
      },
      "Action": "es:*"
    }
  ]
}

EOF

}

resource "aws_iam_policy" "example" {
  name = "osis_role_policy"
  description = "Policy for OSIS pipeline role"
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
        {
          Action = ["es:DescribeDomain"]
          Effect = "Allow"
          Resource = "arn:aws:es:${data.aws_region.current.name}:${local.account_id}:domain/*"
        },
        {
          Action = ["es:ESHttp*"]
          Effect = "Allow"
          Resource = "arn:aws:es:${data.aws_region.current.name}:${local.account_id}:domain/osi-test-domain/*"
        }
    ]
})
}

resource "aws_iam_role_policy_attachment" "example" {
  role       = aws_iam_role.example.name
  policy_arn = aws_iam_policy.example.arn
}

resource "aws_cloudwatch_log_group" "example" {
  name = "/aws/vendedlogs/OpenSearchIngestion/example-pipeline"
  retention_in_days = 365
  tags = {
    Name = "AWS Blog OSIS Pipeline Example"
  }
}

resource "aws_osis_pipeline" "example" {
  pipeline_name               = "example-pipeline"
  pipeline_configuration_body = <<-EOT
            version: "2"
            example-pipeline:
              source:
                http:
                  path: "/test_ingestion_path"
              processor:
                - date:
                    from_time_received: true
                    destination: "@timestamp"
              sink:
                - opensearch:
                    hosts: ["https://${aws_opensearch_domain.test.endpoint}"]
                    index: "application_logs"
                    aws:
                      sts_role_arn: "${aws_iam_role.example.arn}"   
                      region: "${data.aws_region.current.name}"
        EOT
  max_units                   = 1
  min_units                   = 1
  log_publishing_options {
    is_logging_enabled = true
    cloudwatch_log_destination {
      log_group = aws_cloudwatch_log_group.example.name
    }
  }
  tags = {
    Name = "AWS Blog OSIS Pipeline Example"
  }
  }

Crear los recursos

Inicialice el directorio:

terraform init

Revise el plan para ver qué recursos se crearán:

terraform plan

Aplicar la configuración y responder. yes para ejecutar el plan:

terraform apply

El proceso puede tardar entre 7 y 10 minutos en completarse.

Probar la tubería

Después de crear los recursos, debería ver el ingest_endpoint_url salida mostrada. Copie este valor y expórtelo en su variable de entorno:

export OSIS_PIPELINE_ENDPOINT_URL=<Replace with value copied>

Enviar un registro de muestra con awscurl. Reemplace el perfil con su perfil de AWS apropiado para obtener credenciales:

awscurl --service osis --region eu-central-1 -X POST -H "Content-Type: application/json" -d '[{"time":"2014-08-11T11:40:13+00:00","remote_addr":"122.226.223.69","status":"404","request":"GET http://www.k2proxy.com//hello.html HTTP/1.1","http_user_agent":"Mozilla/4.0 (compatible; WOW64; SLCC2;)"}]' https://$OSIS_PIPELINE_ENDPOINT_URL/test_ingestion_path

Deberías recibir un 200 OK como respuesta.

Para verificar que los datos se ingirieron en la canalización de ingesta de OpenSearch y se guardaron en OpenSearch, navegue hasta OpenSearch y obtenga su punto final de dominio. Reemplace la <OPENSEARCH ENDPOINT URL> en el fragmento que se proporciona a continuación y ejecútelo.

awscurl --service es --region eu-central-1 -X GET https://<OPENSEARCH ENDPOINT URL>/application_logs/_search | json_pp 

Debería ver el resultado como se muestra a continuación:

Limpiar

Para destruir los recursos que creó, ejecute el siguiente comando y responda yes Cuando se le solicite:

terraform destroy

El proceso puede tardar entre 30 y 35 minutos en completarse.

Conclusión

En esta publicación, mostramos cómo puede usar Terraform para implementar canalizaciones de ingesta de OpenSearch. AWS ofrece varios digitales para que pueda comenzar rápidamente a crear canalizaciones utilizando OpenSearch Ingestion y utilizar Terraform para implementarlas. Puede utilizar varios integrados integraciones de tuberías para ingerir rápidamente datos de Amazon DynamoDB, Streaming administrado por Amazon para Apache Kafka (Amazon MSK), Lago de seguridad de Amazon, Fluent Bit y muchos más. La siguiente ingesta de OpenSearch planos le permite crear canalizaciones de datos con cambios mínimos de configuración y gestionarlas con facilidad utilizando Terraform. Para obtener más información, consulte el Documentación de Terraform para la ingestión de Amazon OpenSearch.


Acerca de los autores

Rahul Sharma es gerente técnico de cuentas en Amazon Web Services. Le apasionan las tecnologías de datos que ayudan a aprovechar los datos como un activo estratégico y reside en la ciudad de Nueva York, Nueva York.

Farhan Angullia es arquitecto de aplicaciones en la nube en AWS Professional Services, con sede en Singapur. Se centra principalmente en aplicaciones modernas con patrones de software de microservicios y aboga por la implementación de prácticas sólidas de CI/CD para optimizar el ciclo de vida de entrega de software para los clientes. Le gusta contribuir al ecosistema Terraform de código abierto en su tiempo libre.

arjun nambiar es gerente de producto de Amazon OpenSearch Service. Se centra en tecnologías de ingesta que permiten la ingesta de datos de una amplia variedad de fuentes en Amazon OpenSearch Service a escala. Arjun está interesado en sistemas distribuidos a gran escala y tecnologías nativas de la nube y tiene su sede en Seattle, Washington.

Muthu Pitchaimani es un especialista en búsquedas de Amazon OpenSearch Service. Construye aplicaciones y soluciones de búsqueda a gran escala. Muthu está interesado en los temas de redes y seguridad, y tiene su sede en Austin, Texas.

punto_img

Información más reciente

punto_img