docker-elk: Cannot connect to remote PostgreSQL from AWS RDS using JDBC plugin in docker-compose file

Problem description

I have problem connecting a remote PostgreSQL databank from AWS RDS using JDBC plugin in docker-compose and logstash.conf on port 27500. It is worth mentioning that the databank is configured via SSH tunneling as remote port forwarding from port 27500 to port 5432.

It is possible to connect the remote databank locally as localhost:27500 without docker and docker-compose. I also have tested with a locally generated PostgreSQL databank, and this can be connected via localhost on port 5432 (localhost:5432) inside docker-compose.

Log Error Output:

Connection to host.docker.internal:27500 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

Thank you for the help!

Extra information

Stack configuration

My logstash.conf looks like this:

input {
    jdbc{
        jdbc_driver_library => ""
        jdbc_driver_class => "org.postgresql.Driver"
        jdbc_connection_string => "jdbc:postgresql://host.docker.internal:27500/RemoteDb"
        jdbc_user => "postgres"
        jdbc_password => "password"
        statement => 'SELECT  * FROM public."*s";'

        #Tested
        # jdbc_driver_library => ""
        # jdbc_driver_class => "org.postgresql.Driver"
        # jdbc_connection_string => "jdbc:postgresql://host.docker.internal:5432/TestDb"
        # jdbc_user => "postgres"
        # jdbc_password => "password"
        #"jdbc_driver_library => "/usr/share/logstash-core/lib/jars/logstash/postgresql.jar"
    }
}
output{
    elasticsearch{
      hosts => ["https://elasticsearch:9200"]
      index => "logging_senke_eins"
      document_id => "logging_senke_eins%{id}"
      user => admin
      password => admin
      ssl => true
      ssl_certificate_verification => false
    }
}

My docker-compose.yml looks like this:

version: '3.2'

services:
  elasticsearch:
    build:
      context: elasticsearch/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume
        source: elasticsearch
        target: /usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      ELASTIC_PASSWORD: admin
      # Use single node discovery in order to disable production mode and avoid bootstrap checks.
      # see: https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - elk

  logstash:
    build:
      context: logstash/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
      - ./jars/postgresql-42.2.8.jar:/usr/share/logstash/logstash-core/lib/jars/postgresql.jar
    ports:
      - "5044:5044"
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - elk
    depends_on:
      - elasticsearch

  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:
  elk:

volumes:
  elasticsearch:

Docker setup

$ docker version

[OUTPUT HERE]
Client: Docker Engine - Community
 Version:           20.10.10
 API version:       1.41
$ docker-compose version

[OUTPUT HERE]
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0

Container logs

$ docker-compose logs

[OUTPUT HERE]
elasticsearch-logstash      |   Error: Java::OrgPostgresqlUtil::PSQLException: Connection to host.docker.internal:27500 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
elasticsearch-logstash      |   Exception: Sequel::DatabaseConnectionError
elasticsearch-logstash      |   Stack: org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(org/postgresql/core/v3/ConnectionFactoryImpl.java:280)
elasticsearch-logstash      | [2021-11-14T13:54:03,226][ERROR][logstash.inputs.jdbc     ][main][2b43f17e1d4c5948736deb2efb7b0dd94fb1b8a44b1616eac35715baed93bdee] Unable to connect to database. Tried 1 times {:message=>"Java::OrgPostgresqlUtil::PSQLException: Connection to host.docker.internal:27500 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.", :exception=>Sequel::DatabaseConnectionError, :cause=>org.postgresql.util.PSQLException: Connection to host.docker.internal:27500 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections., :backtrace=>["org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(org/postgresql/core/v3/ConnectionFactoryImpl.java:280)", "org.postgresql.core.ConnectionFactory.openConnection(org/postgresql/core/ConnectionFactory.java:49)", "org.postgresql.jdbc.PgConnection.<init>(org/postgresql/jdbc/PgConnection.java:195)", "org.postgresql.Driver.makeConnection(org/postgresql/Driver.java:458)", "org.postgresql.Driver.connect(org/postgresql/Driver.java:260)", "jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", "jdk.internal.reflect.NativeMethodAccessorImpl.invoke(jdk/internal/reflect/NativeMethodAccessorImpl.java:62)", "jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(jdk/internal/reflect/DelegatingMethodAccessorImpl.java:43)", "java.lang.reflect.Method.invoke(java/lang/reflect/Method.java:566)", "org.jruby.javasupport.JavaMethod.invokeDirectWithExceptionHandling(org/jruby/javasupport/JavaMethod.java:471)", "org.jruby.javasupport.JavaMethod.invokeDirect(org/jruby/javasupport/JavaMethod.java:329)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.adapters.jdbc.connect(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/adapters/jdbc.rb:239)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.adapters.jdbc.RUBY$method$connect$0$__VARARGS__(usr/share/logstash/vendor/bundle/jruby/$2_dot_5_dot_0/gems/sequel_minus_5_dot_45_dot_0/lib/sequel/adapters//usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/adapters/jdbc.rb)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.connection_pool.make_new(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/connection_pool.rb:122)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.connection_pool.threaded.assign_connection(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/connection_pool/threaded.rb:209)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.connection_pool.threaded.acquire(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/connection_pool/threaded.rb:139)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.connection_pool.threaded.hold(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/connection_pool/threaded.rb:91)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.database.connecting.synchronize(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/database/connecting.rb:269)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.database.connecting.test_connection(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/database/connecting.rb:278)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.database.misc.initialize(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/database/misc.rb:169)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.database.connecting.connect(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/database/connecting.rb:57)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.sequel_minus_5_dot_45_dot_0.lib.sequel.core.connect(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/sequel-5.45.0/lib/sequel/core.rb:124)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_integration_minus_jdbc_minus_5_dot_0_dot_7.lib.logstash.plugin_mixins.jdbc.jdbc.jdbc_connect(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-integration-jdbc-5.0.7/lib/logstash/plugin_mixins/jdbc/jdbc.rb:114)", "org.jruby.RubyKernel.loop(org/jruby/RubyKernel.java:1442)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_integration_minus_jdbc_minus_5_dot_0_dot_7.lib.logstash.plugin_mixins.jdbc.jdbc.jdbc_connect(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-integration-jdbc-5.0.7/lib/logstash/plugin_mixins/jdbc/jdbc.rb:111)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_integration_minus_jdbc_minus_5_dot_0_dot_7.lib.logstash.plugin_mixins.jdbc.jdbc.open_jdbc_connection(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-integration-jdbc-5.0.7/lib/logstash/plugin_mixins/jdbc/jdbc.rb:155)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_integration_minus_jdbc_minus_5_dot_0_dot_7.lib.logstash.plugin_mixins.jdbc.jdbc.execute_statement(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-integration-jdbc-5.0.7/lib/logstash/plugin_mixins/jdbc/jdbc.rb:213)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_integration_minus_jdbc_minus_5_dot_0_dot_7.lib.logstash.inputs.jdbc.execute_query(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-integration-jdbc-5.0.7/lib/logstash/inputs/jdbc.rb:316)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_integration_minus_jdbc_minus_5_dot_0_dot_7.lib.logstash.inputs.jdbc.run(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-integration-jdbc-5.0.7/lib/logstash/inputs/jdbc.rb:284)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.inputworker(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:405)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.RUBY$method$inputworker$0$__VARARGS__(usr/share/logstash/logstash_minus_core/lib/logstash//usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.start_input(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:396)", "org.jruby.RubyProc.call(org/jruby/RubyProc.java:318)", "java.lang.Thread.run(java/lang/Thread.java:829)"]}
elasticsearch-logstash      | [2021-11-14T13:54:03,236][ERROR][logstash.javapipeline    ][main][2b43f17e1d4c5948736deb2efb7b0dd94fb1b8a44b1616eac35715baed93bdee] A plugin had an unrecoverable error. Will restart this plugin

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 15

Most upvoted comments

Thanks for the detailed issue report! 🙌 It makes our life easier and really helps understanding your problem.

From my experience host.docker.internal should allow containers to access TCP ports exposed on the host. Just to be sure, you’re using Docker for Desktop (Windows or macOS) and not a local Docker daemon running on Linux, right?