OpenSearch is a distributed, open-source search and analytics suite used for a broad set of use cases like real-time application monitoring, log analytics, and website search.
To use AWS OpenSearch Service, we will require LocalStack installed in our Local Development Environment.
LocalStack is a cloud service emulator that runs in a single container on our local development environment. With LocalStack, you can run your AWS services such as SQS, S3, etc entirely on our local dev environment without connecting to a remote service.
Following is an example of a basic LocalStack setup for your docker-compose yaml file
    localstack:
        hostname: localstack
        container_name: '${APP_NAME}-localstack'
        image: localstack/localstack
        ports:
            - "127.0.0.1:3510-3559:4510-4559"  # External service port range
            - "127.0.0.1:4567:4566"            # LocalStack Edge Proxy
        environment:
            - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}
            - DEBUG=${DEBUG-}
            - DATA_DIR=${DATA_DIR-}
            - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR-}
            - OPENSEARCH_ENDPOINT_STRATEGY=path
            - HOST_TMP_FOLDER=${TMPDIR:-/tmp/}localstack
            - DOCKER_HOST=unix:///var/run/docker.sock
        volumes:
            - 'volume-localstack:/var/lib/localstack'
            - '/var/run/docker.sock:/var/run/docker.sock'
            - ./docker/localstack:/docker-entrypoint-initaws.d/
        networks:
            - app-network
Now to add Opensearch we need to use the following Docker image
opensearchproject/opensearch:latest
Here is an example of Opensearch Container for docker-compose yaml file
opensearch:
    container_name: '${APP_NAME}-opensearch'
    image: 'opensearchproject/opensearch'
    environment:
        - node.name=opensearch
        - cluster.name=opensearch-docker-cluster
        - discovery.type=single-node
        - bootstrap.memory_lock=true
        - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
        - "DISABLE_SECURITY_PLUGIN=true"
    ports:
        - "9200:9200"
    ulimits:
        memlock:
            soft: -1
            hard: -1
    volumes:
        - 'volume-opensearch:/usr/share/opensearch/data'
    networks:
        - app-network
The following is a complete Docker compose file
version: '3'
services:
...
-- Other container definitions --
...
    opensearch:
        container_name: '${APP_NAME}-opensearch'
        image: 'opensearchproject/opensearch'
        environment:
            - node.name=opensearch
            - cluster.name=opensearch-docker-cluster
            - discovery.type=single-node
            - bootstrap.memory_lock=true
            - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
            - "DISABLE_SECURITY_PLUGIN=true"
        ports:
            - "9200:9200"
        ulimits:
            memlock:
                soft: -1
                hard: -1
        volumes:
            - 'volume-opensearch:/usr/share/opensearch/data'
        networks:
            - app-network
    localstack:
        hostname: localstack
        container_name: '${APP_NAME}-localstack'
        image: localstack/localstack
        ports:
            - "127.0.0.1:3510-3559:4510-4559"  # External service port range
            - "127.0.0.1:4567:4566"            # LocalStack Edge Proxy
        environment:
            - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}
            - DEBUG=${DEBUG-}
            - DATA_DIR=${DATA_DIR-}
            - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR-}
            - OPENSEARCH_ENDPOINT_STRATEGY=path
            - HOST_TMP_FOLDER=${TMPDIR:-/tmp/}localstack
            - DOCKER_HOST=unix:///var/run/docker.sock
        volumes:
            - 'volume-localstack:/var/lib/localstack'
            - '/var/run/docker.sock:/var/run/docker.sock'
            - ./docker/localstack:/docker-entrypoint-initaws.d/
        networks:
            - app-network
networks:
  app-network:
    driver: bridge
volumes:
  volume-localstack:
    driver: local
  volume-opensearch:
    driver: local
Once you have updated your docker-compose use the following to build the containers
docker compose build docker compose up -d
Now you will be able to access the Opensearch using the following:-
http://localhost:9200
To start using OpenSearch, First we need to create a domain name using the awslocal CLI:
awslocal opensearch create-domain --domain-name app-search-domain
To view the created domain, you can use the following command:-
awslocal opensearch describe-domain --domain-name app-search-domain
From the describe-domain, you will be able to retrieve the domain URL. You can either use the domain url or the Opensearch direct URL from the Opensearch constainer:-
curl localhost:9200/_cluster/health | jq
The above will output insights into the cluster’s health and version information.
Finally create an index using the following command:
curl -X PUT localhost:9200/app-search-index
Now you have a complete setup for local OpenSearch development.
