Ошибка подключения к базе данных Athena из Metabase

Вопрос или проблема

Ранее я использовал два VPC. Один имел кластер MSK и соединитель msk-athena, а второй использовался для запуска Metabase на ECS. Я смог настроить базу данных Athena в Metabase, которая подключалась к Athena для выполнения запросов к теме MSK Kafka. Однако, когда я изменил свою настройку и теперь использовал один VPC для всего, я получил эту ошибку, когда синхронизировал свою базу данных Athena.

16 октября 13:11:53.368 ОШИБКА 44 com.simba.athena.exceptions.ExceptionConverter.toSQLException: [JDBC Драйвер]
java.sql.SQLException: [JDBC Драйвер]
    в com.simba.athena.amazonaws.internal.SdkFilterInputStream.abortIfNeeded(SdkFilterInputStream.java:61)
    в com.simba.athena.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:89)
    в com.simba.athena.amazonaws.event.ProgressInputStream.read(ProgressInputStream.java:180)
    в com.simba.athena.shaded.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper.ensureLoaded(ByteSourceJsonBootstrapper.java:539)
    в com.simba.athena.shaded.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper.detectEncoding(ByteSourceJsonBootstrapper.java:133)
    в com.simba.athena.shaded.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper.constructParser(ByteSourceJsonBootstrapper.java:256)
    в com.simba.athena.shaded.fasterxml.jackson.core.JsonFactory._createParser(JsonFactory.java:1685)
    в com.simba.athena.shaded.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:1084)
    в com.simba.athena.amazonaws.http.JsonResponseHandler.handle(JsonResponseHandler.java:109)
    в com.simba.athena.amazonaws.http.JsonResponseHandler.handle(JsonResponseHandler.java:43)
    в com.simba.athena.amazonaws.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:69)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1794)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutor.handleSuccessResponse(AmazonHttpClient.java:1477)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1384)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1157)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:814)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:781)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:755)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:715)
    в com.simba.athena.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:697)
    в com.simba.athena.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:561)
    в com.simba.athena.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:541)
    в com.simba.athena.amazonaws.services.athena.AmazonAthenaClient.doInvoke(AmazonAthenaClient.java:2570)
    в com.simba.athena.amazonaws.services.athena.AmazonAthenaClient.invoke(AmazonAthenaClient.java:2537)
    в com.simba.athena.amazonaws.services.athena.AmazonAthenaClient.invoke(AmazonAthenaClient.java:2526)
    в com.simba.athena.amazonaws.services.athena.AmazonAthenaClient.executeGetQueryExecution(AmazonAthenaClient.java:1150)
    в com.simba.athena.amazonaws.services.athena.AmazonAthenaClient.getQueryExecution(AmazonAthenaClient.java:1119)
    в com.simba.athena.athena.api.AJClient.executeQuery(Неизвестный источник)
    в com.simba.athena.athena.dataengine.AJQueryExecutor.<init>(Неизвестный источник)
    в com.simba.athena.athena.dataengine.AJDataEngine.prepare(Неизвестный источник)
    в com.simba.athena.athena.dataengine.AJDataEngine.prepare(Неизвестный источник)
    в com.simba.athena.jdbc.common.SPreparedStatement.<init>(Неизвестный источник)
    в com.simba.athena.jdbc.jdbc41.S41PreparedStatement.<init>(Неизвестный источник)
    в com.simba.athena.jdbc.jdbc42.S42PreparedStatement.<init>(Неизвестный источник)
    в com.simba.athena.athena.jdbc42.AJ42PreparedStatement.<init>(Неизвестный источник)
    в com.simba.athena.athena.jdbc42.AJJDBC42ObjectFactory.createPreparedStatement(Неизвестный источник)
    в com.simba.athena.jdbc.common.JDBCObjectFactory.newPreparedStatement(Неизвестный источник)
    в com.simba.athena.jdbc.common.SConnection$5.create(Неизвестный источник)
    в com.simba.athena.jdbc.common.SConnection$5.create(Неизвестный источник)
    в com.simba.athena.jdbc.common.SConnection$StatementCreator.create(Неизвестный источник)
    в com.simba.athena.jdbc.common.SConnection.prepareStatement(Неизвестный источник)
    в com.simba.athena.jdbc.common.SConnection.prepareStatement(Неизвестный источник)
    в com.simba.athena.jdbc.common.SConnection.prepareStatement(Неизвестный источник)
    в clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679)
    в clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626)
    в clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112)
    в clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093)
    в clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182)
    в clojure.java.jdbc$query.invoke(jdbc.clj:1144)
    в clojure.java.jdbc$query.invokeStatic(jdbc.clj:1160)
    в clojure.java.jdbc$query.invoke(jdbc.clj:1144)
    в metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invokeStatic(connection.clj:348)
    в metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invoke(connection.clj:345)
    в metabase.driver.sql_jdbc.connection$can_connect_QMARK_$fn__82191.invoke(connection.clj:357)
    в metabase.driver.sql_jdbc.connection$do_with_connection_spec_for_testing_connection$fn__82173.invoke(connection.clj:333)
    в metabase.util.ssh$do_with_ssh_tunnel.invokeStatic(ssh.clj:165)
    в metabase.util.ssh$do_with_ssh_tunnel.invoke(ssh.clj:154)
    в metabase.driver.sql_jdbc.connection$do_with_connection_spec_for_testing_connection.invokeStatic(connection.clj:328)
    в metabase.driver.sql_jdbc.connection$do_with_connection_spec_for_testing_connection.invoke(connection.clj:324)
    в metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invokeStatic(connection.clj:356)
    в metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invoke(connection.clj:352)
    в metabase.driver.sql_jdbc$fn__108323.invokeStatic(sql_jdbc.clj:49)
    в metabase.driver.sql_jdbc$fn__108323.invoke(sql_jdbc.clj:47)
    в clojure.lang.MultiFn.invoke(MultiFn.java:234)
    в metabase.driver.util$can_connect_with_details_QMARK_$fn__56088.invoke(util.clj:167)
    в clojure.core$binding_conveyor_fn$fn__5823.invoke(core.clj:2047)
    в clojure.lang.AFn.call(AFn.java:18)
    в java.base/java.util.concurrent.FutureTask.run(Неизвестный источник)
    в java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Неизвестный источник)
    в java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Неизвестный источник)
    в java.base/java.lang.Thread.run(Неизвестный источник)
Причина: com.simba.athena.amazonaws.AbortedException: 
    ... еще 71
2024-10-16 13:11:53,273 ОШИБКА driver.util :: Не удалось подключиться к базе данных
java.util.concurrent.TimeoutException: Время ожидания истекло через 10,0 с

Ответ или решение

Ошибка подключения к базе данных Athena из Metabase может возникать по различным причинам, особенно после изменения архитектуры сетевой инфраструктуры. Рассмотрим возможные причины проблемы и предложим решения.

Введение

Проблема, с которой вы столкнулись, возникает в результате перехода от конфигурации с двумя VPC к использованию единственного VPC для всего окружения. Данная ситуация может затрагивать несколько аспектов, включая сетевые настройки, параметры доступа и конфигурацию самого Metabase. Основная ошибка, на которую стоит обратить внимание, — это java.sql.SQLException, которая указывает на проблемы при установлении соединения с базой данных. Давайте детально разберем шаги для устранения этой проблемы.

Возможные причины ошибки

  1. Настройки безопасности VPC: Убедитесь, что группы безопасности (Security Groups) и списки контроля доступа (NACL) правильно настроены. Параметры должны позволять входящий и исходящий трафик на порту 443, который используется для подключения к Athena.

  2. IAM-политики: Проверьте, что IAM-роль, которая используется для доступа к Athena, имеет необходимые права. Необходимо убедиться, что у роли есть доступ к услугам Amazon Athena и Amazon S3 (для хранения данных). Политики должны содержать разрешения на athena:StartQueryExecution, athena:GetQueryExecution, athena:GetQueryResults.

  3. Сетевые параметры: Проверьте, что вы не ограничены настройками VPC Endpoint (если они используются). VPC Endpoint для Athena может требовать дополнительных настроек для правильного маршрута запросов.

  4. Конфигурация Metabase: Убедитесь, что настройки подключения в Metabase (URL, имя пользователя, пароль и настройки JDBC) верны. Пример строк подключения к Athena через JDBC:

    jdbc:awsathena://athena.{region}.amazonaws.com:443;Database={your_database};S3OutputLocation={s3://your-output-bucket}/;

    Убедитесь, что все параметры корректно указаны.

  5. Проблемы с сетью: Использование единого VPC может повлиять на маршрутизацию и доступность ресурсов. Проверьте, что Metabase может достигать всех необходимых ресурсов и что нет дополнительных ограничений, таких как VPN или прокси-серверы.

  6. Тайм-ауты: Ошибка java.util.concurrent.TimeoutException указывает на проблемы с таймаутом соединения. Возможно, стоит увеличить значение таймаута в настройках подключения Metabase.

Шаги для устранения проблемы

  1. Проверка сетевых правил: Убедитесь, что группы безопасности и NACLы разрешают трафик, особенно на порту 443 из контейнера ECS Metabase в сторону AWS Athena.

  2. Обновление IAM политик: Убедитесь, что IAM роль, используемая Metabase, имеет все необходимые разрешения на доступ к Athena и S3.

  3. Тестирование подключения: Попробуйте использовать инструменты, такие как curl или специализированные клиенты JDBC, для тестирования подключения к Athena из экземпляра, на котором работает Metabase.

  4. Просмотр логов: Изучите полные логи Metabase и инфраструктуры для выявления других возможных ошибок, которые могут указывать на причину проблемы.

  5. Изменение параметров таймаута: Проверьте возможность настройки более длительного времени ожидания соединения в конфигурации Metabase.

Заключение

Подключение к Amazon Athena из Metabase в новой сетевой конфигурации может быть сложным процессом, однако, следуя вышеупомянутым рекомендациям, вы сможете быстро диагностировать и устранить проблему. Если проблема не исчезает, рекомендуется обратиться к документации AWS и Metabase или в специализированные форумы для получения дополнительной помощи.

Оцените материал
Добавить комментарий

Капча загружается...