Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

wambaozhixing's avatar

Laravel App hosted on Heroku with a Amazon RDS MySQL Database - Connection Timed Out

I have a Heroku app where I'm hosting my Laravel app. I started the development initially with MySQL, so I wanted to continue doing so using Amazon's RDS service. I create the instance there and managed to successfully connect via my MySQL client, the console etc.

The problem that I'm facing is that the Laravel app can't connect the database after numerous desperate attempts for me to fix it. I have found some articles suggesting the use of DATABASE_URL environment variable is mandatory, so I added it via the Heroku app settings. It looks like so:

mysql://myusername:mypass@myhostnamefromamazon/mydb?sslca=storage/certs/amazon-rds-ca-cert.pem

I found this solution on Heroku's website. I have placed the amazon-rds-ca-cert.pem file on my Laravel's storage folder, like so: /app/storage/certs/amazon-rds-ca-cert.pem

This didn't solve my issue, so then I kept looking and found a Stackoverflow question which had this issue on Lumen. I adjusted my config/database.php according to the answer, but it's still not working for me!

    <?php

    $credentials = get_db_credentials();

    $config = [
        'default' => env('DB_CONNECTION', 'mysql'),
        'connections' => [
            'mysql' => [
                'driver' => 'mysql',
                'host' => env('DB_HOST', $credentials->host),
                'port' => env('DB_PORT', '3306'),
                'database' => env('DB_DATABASE', $credentials->database),
                'username' => env('DB_USERNAME', $credentials->username),
                'password' => env('DB_PASSWORD', $credentials->password),
                'unix_socket' => env('DB_SOCKET', ''),
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
                'prefix' => '',
                'strict' => true,
                'engine' => null,
            ],
        ],
    ];

    if (env('APP_ENV') == 'production') {
        $config['connections']['mysql']['options'] = [PDO::MYSQL_ATTR_SSL_CA => '../storage/certs/amazon-rds-ca-cert.pem'];
    }

    return $config;

The get_db_credentials() function simply parses the DATABASE_URL environment variable.

The exact exception that I get is:

    [2018-10-25 19:32:16] production.ERROR: SQLSTATE[HY000] [2002] Connection timed out {"exception":"[object] (Doctrine\DBAL\Driver\PDOException(code: 2002): SQLSTATE[HY000] [2002] Connection timed out at /tmp/build_05920c42a6de0a378402b798320d3f04/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:50

I'm totally lost on this and unsure how to proceed. Help would be highly appreciated.

0 likes
0 replies

Please or to participate in this conversation.