Salta al contenuto

Come posso risolvere i problemi che riscontro quando mi connetto alla mia istanza database Amazon RDS?

10 minuti di lettura
0

Desidero risolvere il problema che mi impedisce di connettermi alla mia istanza database Amazon Relational Database Service (Amazon RDS).

Breve descrizione

Di seguito sono riportati i motivi per cui la connessione a un'istanza database Amazon RDS potrebbe avere esito negativo:

  • L'origine da collegare all'istanza database non dispone di un accesso autorizzato al gruppo di sicurezza, alle liste di controllo degli accessi di rete (ACL) o ai firewall locali.
  • Il percorso di rete dall'applicazione client all'istanza database non è presente nella tabella di routing.
  • Utilizzi un nome DNS o un endpoint errato per connetterti all'istanza database.
  • L'istanza database non è accessibile pubblicamente e non puoi connetterti tramite Internet.
  • L'istanza database Multi-AZ ha avuto esito negativo e l'istanza database secondaria utilizza una sottorete o una tabella di routing che non consente connessioni in entrata.
  • L'autenticazione dell'utente non è corretta.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Per risolvere i problemi di connessione a un'istanza database Amazon RDS, completa le seguenti attività:

Utilizza la diagnosi automatica

Inizia con strumenti automatici per identificare rapidamente i problemi di connessione.

Completa i seguenti passaggi:

  1. Per eseguire lo strumento di diagnosi automatica, utilizza questo comando start-automation-execution di AWS Systems Manager:
    aws ssm start-automation-execution \
        --document-name "AWSSupport-TroubleshootConnectivityToRDS" \
        --parameters "InstanceId=EC2-INSTANCE-ID,DBInstanceIdentifier=DB-INSTANCE-NAME"
    Nota: sostituisci EC2-INSTANCE-ID con l'ID della tua istanza EC2 e DB-INSTANCE-NAME con l'identificatore della tua istanza RDS.
  2. Per verificare i risultati dell'automazione, esegui questo comando get-automation-execution:
    aws ssm get-automation-execution \
        --automation-execution-id EXECUTION-ID
    Nota: sostituisci EXECUTION-ID con l'ID di esecuzione del passaggio 1.

Per istruzioni sull'esecuzione del runbook e dettagli sui controlli eseguiti, consulta AWSSupport-TroubleshootConnectivityToRDS.

Verifica lo stato dell'istanza database

Verifica che l'istanza database sia disponibile e pronta per le connessioni.

Completa i seguenti passaggi:

  1. Per verificare lo stato dell'istanza database, esegui questo comando describe-db-instances:
    aws rds describe-db-instances \
        --db-instance-identifier DB-INSTANCE-NAME \
        --query 'DBInstances[*].DBInstanceStatus'
    Nota: sostituisci DB-INSTANCE-NAME con l'identificatore della tua istanza Amazon RDS.
  2. Attendi che lo stato sia disponibile prima di tentare le connessioni. Le istanze nuove o riavviate possono richiedere fino a 20 minuti per diventare disponibili.

Controlla le regole del gruppo di sicurezza

I gruppi di sicurezza controllano l'accesso di rete all'istanza Amazon RDS. Verifica che consentano il traffico dall'origine.

Completa i seguenti passaggi:

  1. Per identificare i gruppi di sicurezza collegati all'istanza Amazon RDS, esegui questo comando describe-db-instances:
    aws rds describe-db-instances \
        --db-instance-identifier DB-INSTANCE-NAME \
        --query 'DBInstances[*].VpcSecurityGroups[*].VpcSecurityGroupId'
    Nota: sostituisci DB-INSTANCE-NAME con l'identificatore della tua istanza RDS.
  2. Per controllare le regole in entrata di ogni gruppo di sicurezza, esegui questo comando describe-security-groups:
    aws ec2 describe-security-groups \
        --group-ids SECURITY-GROUP-ID \
        --query 'SecurityGroups[*].IpPermissions'
    Nota: sostituisci SECURITY-GROUP-ID con l'ID di ogni gruppo di sicurezza del passaggio 1.
  3. Per aggiungere una regola che consenta l'indirizzo IP, esegui questo comando authorize-security-group-ingress:
    aws ec2 authorize-security-group-ingress \
        --group-id SECURITY-GROUP-ID \
        --protocol tcp \
        --port DATABASE-PORT \
        --cidr YOUR-IP-ADDRESS/32
    Nota: sostituisci SECURITY-GROUP-ID con l'ID del tuo gruppo di sicurezza. Sostituisci DATABASE-PORT con la porta del tuo database (3306 per MySQL, 5432 per PostgreSQL). Sostituisci YOUR-IP-ADDRESS con il tuo indirizzo IP pubblico.

Verifica le regole dell'ACL

Le liste di controllo degli accessi alla rete (ACL) forniscono una protezione a livello di sottorete. Verifica che consentano il traffico del database.

Completa i seguenti passaggi:

  1. Per identificare la lista di controllo degli accessi alla rete (ACL) per la sottorete Amazon RDS, esegui questo comando describe-network-acls:
    aws ec2 describe-network-acls \
        --filters "Name=association.subnet-id,Values=SUBNET-ID" \
        --query 'NetworkAcls[*].NetworkAclId'
    Nota: sostituisci SUBNET-ID con l'ID della sottorete RDS:
  2. Per controllare le regole della lista di controllo degli accessi alla rete (ACL), esegui questo comando describe-network-acls:
    aws ec2 describe-network-acls \
        --network-acl-ids NETWORK-ACL-ID \
        --query 'NetworkAcls[*].Entries'
    Nota: sostituisci NETWORK-ACL-ID con l'ID dell'ACL del passaggio 1.
  3. Verifica che le regole in entrata consentano il traffico sulla porta del database e che le regole in uscita consentano porte effimere (1024-65535).

Controlla la configurazione delle tabelle di routing

Le tabelle di routing indirizzano il traffico di rete. Verifica che forniscano il routing corretto all'istanza Amazon RDS.

Completa i seguenti passaggi:

  1. Per controllare la tabella di routing della sottorete Amazon RDS, esegui questo comando describe-route-tables:
    CMD
    Nota: sostituisci SUBNET-ID con l'ID della tua sottorete RDS.
  2. Per l'accesso pubblico, verifica che esista una route verso un gateway Internet ([IP_ADDRESS]).
  3. Per l'accesso privato, verifica le route verso i gateway NAT, le connessioni peering VPC o i gateway VPN, a seconda dei casi.

Per ulteriori informazioni, consulta Come posso risolvere i problemi relativi agli indirizzi IP delle mie istanze database Amazon RDS?

Controlla gli errori di risoluzione DNS

Verifica che l'endpoint Amazon RDS si risolva nell'indirizzo IP corretto.

Completa i seguenti passaggi:

  1. Per verificare la risoluzione DNS del client, esegui questo comando:

    nslookup RDS-ENDPOINT

    Nota: sostituisci RDS-ENDPOINT con l'endpoint della tua istanza RDS.

  2. Per eseguire la verifica con dig, esegui questo comando:

    dig RDS-ENDPOINT
  3. Se la risoluzione DNS non riesce, controlla le impostazioni DNS di Amazon VPC o utilizza un server DNS diverso.

Verifica la connettività di rete

Verifica la connettività di rete all'istanza RDS prima di verificare l'autenticazione del database.

Completa i seguenti passaggi:

  1. Per verificare la connettività all'istanza Amazon RDS, esegui questo comando telnet:

    telnet RDS-ENDPOINT DATABASE-PORT

    Nota: sostituisci RDS-ENDPOINT con il tuo endpoint di RDS e DATABASE-PORT con la porta del tuo database.

  2. Per eseguire la verifica con netcat, esegui questo comando:

    nc -zv RDS-ENDPOINT DATABASE-PORT
  3. Se la connessione ha esito positivo, è probabile che il problema sia correlato all'autenticazione. Se ha invece esito negativo, il problema dipende dalla rete.

Per ulteriori informazioni, consulta Troubleshoot network connectivity to Amazon RDS databases using VPC Reachability Analyzer (Risoluzione dei problemi di connettività di rete ai database Amazon RDS utilizzando il sistema di analisi della reperibilità VPC).

Verifica l'autenticazione del database

Verifica le credenziali del database e il metodo di autenticazione.

Completa i seguenti passaggi:

  1. Per verificare l'autenticazione tramite password per MySQL, esegui questo comando:
    mysql -h RDS-ENDPOINT -P DATABASE-PORT -u USERNAME -p
    Nota: sostituisci RDS-ENDPOINT con il tuo endpoint, DATABASE-PORT con la tua porta e USERNAME con il nome utente del tuo database.
  2. Per verificare l'autenticazione tramite password per PostgreSQL, esegui questo comando:
    psql -h RDS-ENDPOINT -p DATABASE-PORT -U USERNAME -d DATABASE-NAME
    Nota: sostituisci RDS-ENDPOINT, DATABASE-PORT, USERNAME e DATABASE-NAME con i tuoi valori.
  3. Per reimpostare la password principale, se necessario, esegui questo comando modify-db-instance:
    aws rds modify-db-instance \
        --db-instance-identifier DB-INSTANCE-NAME \
        --master-user-password NEW-PASSWORD \
        --apply-immediately
    Nota: sostituisci DB-INSTANCE-NAME con l'identificatore della tua istanza e NEW-PASSWORD con la tua nuova password.

Verifica i limiti di connessione

Verifica che l'istanza Amazon RDS non abbia raggiunto i limiti di connessione.

Completa i seguenti passaggi:

  1. Per verificare le connessioni correnti per MySQL, connettiti al database ed esegui questa query:

    SHOW STATUS LIKE 'Threads_connected';
    SHOW VARIABLES LIKE 'max_connections';
  2. Per verificare le connessioni correnti per PostgreSQL, esegui questa query:

    SELECT count(*) FROM pg_stat_activity;
    SHOW max_connections;
  3. Per verificare la presenza di errori di connessione in MySQL, esegui questa query:

    SHOW STATUS LIKE 'Connection_errors%';
    SHOW STATUS LIKE 'Max_used_connections';

Se l'istanza Amazon RDS raggiunge i limiti di connessione, completa i seguenti passaggi:

  1. Per identificare le connessioni inattive che possono essere terminate in MySQL, esegui questa query:

    SELECT id, user, host, db, command, time, state, info
    FROM information_schema.processlist
    WHERE command = 'Sleep' AND time > 300
    ORDER BY time DESC;
  2. Per terminare le connessioni inattive in MySQL, esegui questo comando:

    CALL mysql.rds_kill(CONNECTION-ID);

    Nota: sostituisci CONNECTION-ID con l'ID della connessione del passaggio 1.

  3. Per aumentare il parametro max_connections, esegui questo comando modify-db-parameter-group:

    aws rds modify-db-parameter-group \
        --db-parameter-group-name PARAMETER-GROUP-NAME \
        --parameters "ParameterName=max_connections,ParameterValue=NEW-VALUE,ApplyMethod=pending-reboot"

    Nota: sostituisci PARAMETER-GROUP-NAME con il nome del tuo gruppo di parametri e NEW-VALUE con il limite di connessione che desideri. Devi riavviare dopo aver modificato max_connections.

  4. Per applicare le modifiche ai parametri, riavvia l'istanza Amazon RDS. Esegui questo comando reboot-db-instance:

    aws rds reboot-db-instance \
        --db-instance-identifier DB-INSTANCE-NAME

    Nota: sostituisci DB-INSTANCE-NAME con l'identificatore della tua istanza Amazon RDS.

  5. Per implementare il pool di connessioni con Server proxy per RDS, esegui questo comando create-db-proxy:

    aws rds create-db-proxy \
        --db-proxy-name PROXY-NAME \
        --engine-family mysql \
        --target-group-config DBInstanceIdentifiers=DB-INSTANCE-NAME \
        --vpc-subnet-ids SUBNET-ID-1,SUBNET-ID-2 \
        --auth AuthScheme=SECRETS,SecretArn=SECRET-ARN

    Nota: sostituisci PROXY-NAME, DB-INSTANCE-NAME, SUBNET-ID-1, SUBNET-ID-2 e SECRET-ARN con i tuoi valori.

Verifica i limiti di connessione specifici dell'utente

Completa i seguenti passaggi:

  1. Per verificare il valore max_user_connections corrente, esegui questa query:

    SHOW VARIABLES LIKE 'max_user_connections';
  2. Per verificare le connessioni correnti per utente, esegui questa query:

    SELECT user, COUNT(*) as connection_count
    FROM information_schema.processlist
    GROUP BY user
    ORDER BY connection_count DESC;
  3. Per verificare se un utente specifico ha raggiunto il limite di connessione, esegui questa query:

    SELECT user, max_user_connections
    FROM mysql.user
    WHERE user = 'USERNAME';

    Nota: sostituisci USERNAME con il nome utente specifico che presenta problemi di connessione.

Il parametro max_user_connections può impedire a utenti specifici di connettersi anche quando i limiti di connessione complessivi non vengono raggiunti.

Se l'istanza Amazon RDS raggiunge il numero massimo di connessioni per utente, completa i seguenti passaggi:

  1. Per aumentare il parametro max_user_connections a livello globale, esegui questo comando modify-db-parameter-group:
    aws rds modify-db-parameter-group \
        --db-parameter-group-name PARAMETER-GROUP-NAME \
        --parameters "ParameterName=max_user_connections,ParameterValue=NEW-VALUE,ApplyMethod=immediate"
    Nota: sostituisci PARAMETER-GROUP-NAME con il nome del tuo gruppo di parametri e NEW-VALUE con il limite di connessione per utente desiderato.
  2. Per modificare i limiti di connessione per un account utente specifico, esegui questa query:
    ALTER USER 'USERNAME'@'%' WITH MAX_USER_CONNECTIONS NEW-LIMIT;
    Nota: sostituisci USERNAME con il nome utente e NEW-LIMIT con il limite di connessione desiderato per l'utente in questione.

Per ulteriori informazioni, consulta Setting Account Resource Limits (Impostazione dei limiti delle risorse dell'account) sul sito web MySQL.

Verifica i limiti di errore di connessione

Completa i seguenti passaggi:

  1. Per verificare il valore max_connect_errors corrente per Amazon RDS per MySQL, esegui questa query:

    SHOW VARIABLES LIKE 'max_connect_errors';
  2. Per verificare se alcuni host sono attualmente bloccati, esegui questa query:

    SELECT * FROM performance_schema.host_cache
    WHERE SUM_CONNECT_ERRORS > 0;
  3. Per verificare l'attuale numero di errori di connessione per l'host, esegui questa query:

    SELECT HOST, SUM_CONNECT_ERRORS, COUNT_HANDSHAKE_ERRORS, COUNT_AUTHENTICATION_ERRORS
    FROM performance_schema.host_cache
    WHERE HOST = 'YOUR-CLIENT-IP';

    Nota: sostituisci YOUR-CLIENT-IP con l'indirizzo IP effettivo del tuo client.

  4. Per svuotare la cache dell'host e sbloccare tutti gli host, esegui questa query:

    FLUSH HOSTS;
  5. Per aumentare il parametro max_connect_errors in modo da evitare blocchi futuri, esegui questo comando modify-db-parameter-group:

    aws rds modify-db-parameter-group \
        --db-parameter-group-name PARAMETER-GROUP-NAME \
        --parameters "ParameterName=max_connect_errors,ParameterValue=NEW-VALUE,ApplyMethod=immediate"

    Nota: sostituisci PARAMETER-GROUP-NAME con il nome del tuo gruppo di parametri e NEW-VALUE con un limite maggiore, ad esempio 1.000.000.

  6. Per verificare che la modifica del parametro sia stata applicata, esegui nuovamente la query del passaggio 1 e verifica il nuovo valore.

Per ulteriori informazioni, consulta How do I resolve the "Host is blocked because of many connections errors" error in Amazon RDS for MySQL? (Come posso risolvere l'errore "Host is blocked because of many connections errors" in Amazon RDS per MySQL?)

Informazioni correlate

Impossibile connettersi all'istanza database di Amazon RDS

Using SSL/TLS to encrypt a connection to a DB instance or cluster (Utilizzo di SSL/TLS per crittografare una connessione a un'istanza database o a un cluster)

Come posso connettermi a un'istanza database Amazon RDS che utilizza una sottorete pubblica o privata di un Amazon VPC?