php - aws - how to connect to rds from ec2




"Eccezione PDO: php_network_getaddresses: getaddrinfo non riuscito" dopo aver modificato i risolutori DNS, con DB in esecuzione su AWS (2)

Questo è un bug in libc, secondo:

https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1674733

php_network_getaddresses: getaddrinfo non riuscito: nome o servizio non noto ubuntu

Nella nostra app Laravel 5.2, abbiamo una configurazione DB in esecuzione su AWS, utilizzando più server di lettura (e più connessioni DB).

Di notte, abbiamo modificato i risolutori DNS per tutti i server Web in Google DNS (8.8.8.8 e 8.8.4.4). Quindi, i server hanno iniziato a sputare questi:

PDOException: eccezione "PDOException" con messaggio " SQLSTATE [HY000] [2002] php_network_getaddresses: getaddrinfo non riuscito: nome o servizio non noto " in /home/forge/studydrive.net/releases/20170320162143/vendor/laravel/framework/src/Illuminate /Database/Connectors/Connector.php:55

Il codice in Connector.php:55 è semplicemente il costruttore PDO:

public function createConnection($dsn, array $config, array $options)
{
    $username = Arr::get($config, 'username');

    $password = Arr::get($config, 'password');

    try {
        $pdo = new PDO($dsn, $username, $password, $options); // <== THIS ONE
    } catch (Exception $e) {
        $pdo = $this->tryAgainIfCausedByLostConnection(
            $e, $dsn, $username, $password, $options
        );
    }

        return $pdo;
    }

La configurazione di .env per l'AWS (con le parti sesnitive modificate):

DB_HOST=myapp-cluster.cluster-123abc.eu-west-2.rds.amazonaws.com
DB_HOST_WRITE=myapp-cluster.cluster-123abc.eu-west-2.rds.amazonaws.com
DB_HOST_READ=myapp-cluster.cluster-ro-123abc.eu-west-2.rds.amazonaws.com

Quindi, sembra che il PDO di PHP non sia in grado di risolvere il nome di DB_HOST .

Si noti che non è possibile utilizzare un IP per DB_HOST , poiché il nome host (sul lato AWS) viene mappato su 3 diversi server READ del database.

Inoltre, prima di cambiare i resolver, tutto andava bene.

Qualcuno ha idea di cosa potrebbe causare l'errore PDO o come risolverlo?


A partire dal 20 marzo, molti utenti di Ubuntu sul web hanno improvvisamente riscontrato problemi di risoluzione DNS nelle loro applicazioni a causa di un cattivo aggiornamento rilasciato da Canonical (i manutentori di Ubuntu) che interrompe la risoluzione DNS dopo poche ore di operatività. Ecco la segnalazione di bug in cui il problema è stato segnalato e triaged:

https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/1674532

Ciò potrebbe aver causato errori del CMS per aggiornare / installare temi plug-in / installazione, errori di connessione a API esterne e / o messaggi di errore simili ai seguenti:

Attenzione: file_get_contents (): php_network_getaddresses: getaddrinfo non riuscito: nessun indirizzo associato con hostname Impossibile risolvere l'host: downloads.wordpress.org errore cURL 6: impossibile risolvere l'host: example.com in .... Fortunatamente Canonical è stato in grado di risolvere il problema, ma i sistemi interessati devono aggiornarsi per acquisire la correzione. Per fare ciò, avrai bisogno del DNS funzionante, quindi se è attualmente inattivo, per prima cosa riavvia il Droplet. Una volta che la risoluzione DNS funziona normalmente, esegui:

sudo apt-get update
sudo apt-get upgrade

Quindi puoi controllare le tue versioni per assicurarti di averne quelle giuste. Questo può essere fatto con:

# sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'

Se sei su Ubuntu 16.X, dovresti vedere un output simile al seguente:

# sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'
2.23-0ubuntu7
2.23-0ubuntu7
2.23-0ubuntu7

Se sei su Ubuntu 14.X, dovresti vedere un output simile al seguente:

# sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'
2.19-0ubuntu6.11
2.19-0ubuntu6.11

Se vedi versioni precedenti di questi pacchetti, dovrai eseguire l'aggiornamento seguendo le istruzioni precedenti per evitare questo problema.