mysql2-lambda icon indicating copy to clipboard operation
mysql2-lambda copied to clipboard

SSL Support?

Open davidplappert opened this issue 3 years ago • 7 comments

I am trying to use a PlanetScale database with my Ruby Lambda, and while I can run it locally and in docker, I get "SSL connection error: unknown error number" when running in Lambda.

  require 'active_record'
  require 'mysql2-lambda'
  require 'mysql2'
  ActiveRecord::Base.establish_connection(
    adapter: 'mysql2',
    database: 'xxx',
    username: 'xxx',
    host: 'xxx',
    password: 'xxx,
    sslverify: true,
    # ssl_mode: :verify_identity,
    # sslca: '/etc/ssl/cert.pem',
  )
    "errorMessage": "SSL connection error: unknown error number",
    "errorType": "Function<ActiveRecord::ConnectionNotEstablished>",
    "stackTrace": [
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:45:in `rescue in new_client'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:39:in `new_client'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:23:in `mysql2_connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:882:in `public_send'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:882:in `new_connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:926:in `checkout_new_connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:905:in `try_to_checkout_new_connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:866:in `acquire_connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:588:in `checkout'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:428:in `connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:1128:in `retrieve_connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_handling.rb:327:in `retrieve_connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_handling.rb:283:in `connection'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/model_schema.rb:553:in `load_schema!'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/attributes.rb:250:in `load_schema!'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/model_schema.rb:539:in `block in load_schema'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/model_schema.rb:536:in `synchronize'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/model_schema.rb:536:in `load_schema'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/model_schema.rb:392:in `columns_hash'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/relation/query_methods.rb:1313:in `arel_column'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/relation/calculations.rb:280:in `aggregate_column'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/relation/calculations.rb:299:in `execute_simple_calculation'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/relation/calculations.rb:269:in `perform_calculation'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/relation/calculations.rb:144:in `calculate'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/relation/calculations.rb:51:in `count'",
        "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/querying.rb:22:in `count'",
        "/var/task/router.rb:8:in `router'"
    ]

davidplappert avatar Oct 06 '21 02:10 davidplappert

Can you remove that extra require 'mysql2' it should not be needed. Also, what Ruby version are you using? 2.5 or 2.7?

metaskills avatar Oct 06 '21 11:10 metaskills

done, and 2.7

davidplappert avatar Oct 09 '21 05:10 davidplappert

Would you mind doing a little research into what this means for the client side?

https://github.com/brianmario/mysql2#ssl-options

but only if your MySQL client library and server have been compiled with SSL support.

Maybe we need some configure args for in our Dockerfile for the MySQL Connector?

metaskills avatar Oct 10 '21 12:10 metaskills

@metaskills Looking into this from our side, curious to know if there's a reason for using this specific version of MySQL Connector, as it's quite dated.

https://github.com/customink/mysql2-lambda/blob/e5748e875e679384bdea031b760b1646b0bf35dc/Dockerfile#L22

Haven't confirmed yet if this is the reason, but wanted to check either way.

lizztheblizz avatar Oct 25 '21 18:10 lizztheblizz

Hey @lizztheblizz, no reason that I can think of or remember. Maybe it was the only one I could find. Very open to changing/fixing that too.

metaskills avatar Oct 26 '21 13:10 metaskills

This is still an issue.

SSL connection error: unknown error number

SSL connection error: unknown error number: ["/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/mysql2_adapter.rb:53:in rescue in new_client'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/mysql2_adapter.rb:43:in new_client'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/mysql2_adapter.rb:23:in mysql2_connection'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:656:in public_send'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:656:in new_connection'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:700:in checkout_new_connection'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:679:in try_to_checkout_new_connection'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:640:in acquire_connection'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:341:in checkout'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:181:in connection'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_handler.rb:211:in retrieve_connection'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_handling.rb:313:in retrieve_connection'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/connection_handling.rb:280:in connection'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/model_schema.rb:580:in load_schema!'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/attributes.rb:264:in load_schema!'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/encryption/encryptable_record.rb:122:in load_schema!'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/model_schema.rb:566:in block in load_schema'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/model_schema.rb:563:in synchronize'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/model_schema.rb:563:in load_schema'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/model_schema.rb:429:in attribute_types'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/model_schema.rb:455:in type_for_attribute'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/type_caster/map.rb:16:in type_for_attribute'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/arel/table.rb:107:in type_for_attribute'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/table_metadata.rb:18:in type'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/predicate_builder.rb:59:in build'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/predicate_builder.rb:54:in []'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/predicate_builder.rb:126:in block in expand_from_hash'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/predicate_builder.rb:79:in each'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/predicate_builder.rb:79:in flat_map'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/predicate_builder.rb:79:in expand_from_hash'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/predicate_builder.rb:25:in build_from_hash'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/query_methods.rb:1313:in build_where_clause'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/query_methods.rb:756:in where!'\", \"/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/relation/query_methods.rb:751:in where'", "/var/task/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.4/lib/active_record/querying.rb:22:in where'\", \"/var/task/app/controllers/livestream/dash/list.rb:4:in livestream_dash_list_post'", "/var/task/router.rb:116:in router'\", \"/var/runtime/lib/lambda_handler.rb:26:in call_handler'", "/var/runtime/lib/runtime.rb:99:in `

'"]"

davidplappert avatar Sep 10 '22 04:09 davidplappert

Any updates/fixes exptected on this issue?

activklaus avatar Oct 11 '22 10:10 activklaus

This is still an issue

richardsondx avatar Nov 25 '22 21:11 richardsondx

I'll take a look at this today.

metaskills avatar Nov 28 '22 17:11 metaskills

Not able to make any progress when using yum install mariadb-devel and getting a static file. Keep running into a undefined symbol: mysql_server_init error. I recommend you switch to Lambda Containers and do the yum install for mariadb and letting libmysqlclient.so.18 end up in the container's needed location.

metaskills avatar Nov 28 '22 19:11 metaskills

Lambda Containers?
What's your recommended way to debug lamby issues? or when you get an issue in prod?I tried running the docker container locally; but I often don't get the same issues I see on my container and once I deploy – and the whole debugging process is pretty slow since I need to deplpoy to test the changes each time.

richardsondx avatar Nov 28 '22 20:11 richardsondx

Here is a good example of how all that works in the latest Lamby Cookiecutter work. https://github.com/customink/lamby-cookiecutter/pull/21

metaskills avatar Dec 04 '22 14:12 metaskills

Basically, there is a 1-1 parity now in dev and prod. Same container is used. Hope that helps?

metaskills avatar Dec 05 '22 14:12 metaskills