Questo documento descrive come connettersi a Spanner Omni utilizzando PGAdapter. Configura PGAdapter per stabilire connessioni sicure. PGAdapter supporta connessioni in testo normale, Transport Layer Security (TLS), TLS con credenziali, e mutual TLS (mTLS). Queste configurazioni di sicurezza proteggono i dati durante la trasmissione fornendo vari livelli di crittografia e autenticazione. Ogni configurazione richiede impostazioni client specifiche per garantire l'integrità e la riservatezza dei dati.
Puoi eseguire PGAdapter come processo autonomo o integrarlo direttamente nella tua applicazione. Per la gestione interattiva e l'esecuzione manuale delle query, connettiti al database utilizzando gli strumenti PostgreSQL standard come psql. Per creare applicazioni automatizzate, utilizza driver compatibili con PostgreSQL come i seguenti:
pgxper Gopsycopg3per Pythonnode-postgresper Node.js
Per esempi di codice che utilizzano alcuni di questi driver, consulta il codice campione in questo documento.
Prima di iniziare
Per utilizzare PGAdapter con Spanner Omni, utilizza PGAdapter versione 0.55.2 o successive.
Se utilizzi Maven senza la distinta base (BOM), aggiungi quanto segue alle dipendenze del file pom.xml:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-spanner-pgadapter</artifactId>
<version>0.55.2</version>
</dependency>
Configurazioni di sicurezza
Spanner Omni PGAdapter supporta quattro configurazioni di sicurezza, che definiscono la modalità di crittografia e autenticazione della comunicazione tra PGAdapter e il database. Per utilizzare queste configurazioni, imposta le opzioni client descritte nella tabella seguente:
| Configurazione di sicurezza | Descrizione |
|---|---|
| Testo normale | La comunicazione non è criptata. |
| TLS | La comunicazione è criptata utilizzando Transport Layer Security (TLS). Questa configurazione richiede l'aggiunta del certificato CA di Spanner Omni all'archivio attendibilità Java, come descritto in Configurare l'archivio attendibilità Java. |
| TLS con credenziali | La comunicazione è criptata utilizzando TLS e l'autenticazione viene eseguita utilizzando un nome utente e una password. |
| mTLS | La comunicazione è criptata utilizzando mutual TLS (mTLS). Questa configurazione richiede di fornire sia un certificato client sia una chiave privata client. |
Eseguire come processo autonomo
Esegui PGAdapter come processo autonomo per applicazioni non Java e per strumenti PostgreSQL standard, ad esempio psql, quando hai bisogno di un'interazione manuale con il database. Questo approccio disaccoppia il proxy dal ciclo di vita dell'applicazione, consentendoti di gestirlo e aggiornarlo in modo indipendente. Per avviare PGAdapter come processo autonomo, utilizza i seguenti metodi di configurazione in base alla configurazione di sicurezza selezionata:
Testo normale
Per avviare PGAdapter con la comunicazione in testo normale, esegui il comando seguente:
java -jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "type=omni;usePlainText=true"
Sostituisci quanto segue:
DATABASE_ID: l'ID del database Spanner Omni, ad esempiotest-db.ENDPOINT: l'endpoint dell'istanza Spanner Omni, ad esempiolocalhost:15000.
TLS
Per configurare una connessione PGAdapter utilizzando TLS, devi aggiungere il tuo certificato CA di Spanner Omni all'archivio di attendibilità Java, come descritto in Configurare l'archivio di attendibilità Java.
Per avviare PGAdapter utilizzando TLS, esegui il comando seguente:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts \
-Djavax.net.ssl.trustStoreType=JKS \
-jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "type=omni"
TLS con credenziali
Per stabilire una connessione TLS con l'autenticazione tramite nome utente e password, utilizza il parametro -r per specificare username e password:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts \
-Djavax.net.ssl.trustStoreType=JKS \
-jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "type=omni;username=USERNAME;password=PASSWORD"
Sostituisci quanto segue:
USERNAME: il nome utente per l'utente Spanner Omni.PASSWORD: la password per l'utente Spanner Omni.
mTLS
Prima di poter avviare PGAdapter utilizzando mTLS, devi assicurarti che la chiave client sia in formato PKCS#8. Per convertire una chiave esistente in formato PKCS#8, esegui il comando seguente:
openssl pkcs8 -topk8 -in ~/.spanner/certs/client.key -out ~/.spanner/certs/java-client.key -nocrypt
In alternativa, quando crei il certificato e la chiave client utilizzando la CLI di Spanner Omni, fornisci il parametro --generate-pkcs8-key per generare la chiave in formato PKCS#8.
Per avviare PGAdapter utilizzando mTLS, esegui il comando seguente:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts \
-Djavax.net.ssl.trustStoreType=JKS \
-jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "type=omni;clientCertificate=PATH_TO_CLIENT_CERT;clientKey=PATH_TO_CLIENT_KEY"
Sostituisci quanto segue:
PATH_TO_CLIENT_CERT: il percorso del file del certificato client.PATH_TO_CLIENT_KEY: il percorso del file della chiave client.
Connettersi con psql
Dopo aver stabilito una connessione utilizzando uno dei metodi precedenti, esegui psql per gestire il database ed eseguire query. Per connetterti a psql, utilizza il comando seguente:
psql -h PG_HOST -p PG_PORT -U USERNAME -d DATABASE_ID
Sostituisci quanto segue:
PG_HOST: il nome host o l'indirizzo IP della macchina in cui è in esecuzione PGAdapter. In caso di esecuzione locale, utilizzalocalhost.PG_PORT: il numero di porta su cui è in esecuzione PGAdapter. Se non hai specificato una porta personalizzata, PGAdapter utilizza la porta5432per impostazione predefinita.USERNAME: il tuo nome utente PostgreSQL.
Eseguire in-process con l'applicazione
Puoi anche avviare PGAdapter in-process con la tua applicazione. Per stabilire la sicurezza, configura l'oggetto OptionsMetadata per ogni configurazione di sicurezza supportata:
Testo normale
Per la comunicazione in testo normale in ambienti come lo sviluppo o il test locale, utilizza la seguente configurazione:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setType("omni")
.setUsePlainText();
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
TLS
Per stabilire una connessione TLS, aggiungi il certificato CA all'archivio di attendibilità Java come descritto in Configurare l'archivio di attendibilità Javae utilizza la seguente configurazione:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setType("omni");
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
TLS con credenziali
Per stabilire una connessione TLS con l'autenticazione tramite nome utente e password, utilizza setProperties() per specificare il nome utente e la password:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setType("omni")
.setProperties(
Map.of(
"username", "USERNAME",
"password", "PASSWORD"));
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
mTLS
Per avviare PGAdapter in-process con l'applicazione Java utilizzando mTLS, la chiave client deve utilizzare il formato PKCS#8.
Per stabilire una connessione mTLS in-process, utilizza questa configurazione:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setType("omni")
.useClientCert(
"PATH_TO_CLIENT_CERT",
"PATH_TO_CLIENT_KEY");
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
Codice campione
Questa sezione fornisce codice campione per la connessione a un database Spanner Omni utilizzando i seguenti driver compatibili con PostgreSQL:
Sostituisci il seguente segnaposto nelle stringhe di connessione:
- PASSWORD: la password per l'utente PostgreSQL.
JDBC
Puoi connetterti a PGAdapter utilizzando il driver JDBC PostgreSQL come se ti stessi connettendo a un database PostgreSQL. Per connetterti ed eseguire query su una tabella in un database Spanner Omni, utilizza il seguente codice campione:
String jdbcUrl =
"jdbc:postgresql://PG_HOST:PG_PORT/DATABASE_ID";
try (Connection connection = DriverManager.getConnection(jdbcUrl)) {
// Example: Query data
try (Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM Singers")) {
System.out.println("Query Results:");
while (resultSet.next()) {
long id = resultSet.getLong("id");
String name = resultSet.getString("name");
System.out.printf("ID: %d, Name: %s\n", id, name);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
Go (pgx)
Puoi connetterti a PGAdapter utilizzando pgx come se ti stessi connettendo a un database PostgreSQL. Utilizza il seguente codice campione:
// Database connection string
connString := "postgres://USERNAME:PASSWORD@PG_HOST:PG_PORT/DATABASE_ID?sslmode=disable"
ctx := context.Background()
// Connect to PGAdapter
conn, err := pgx.Connect(ctx, connString)
if err != nil {
log.Fatalf("Connection error: %s", err.Error())
}
defer conn.Close(ctx)
// Query all rows from the Singers table
rows, err := conn.Query(ctx, "SELECT id, name FROM Singers")
if err != nil {
log.Fatalf("Query error: %s", err.Error())
}
defer rows.Close()
// Iterate over the result set
fmt.Println("Singers Table Data:")
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatalf("Scan error: %s", err.Error())
}
fmt.Printf("ID: %d, Name: %s\n", id, name)
}
Python (psycopg2 o psycopg3)
Puoi connetterti a PGAdapter utilizzando psycopg2 o psycopg3 come se ti stessi connettendo a un database PostgreSQL. Per connetterti ed eseguire query su una tabella in un database Spanner Omni, utilizza il seguente codice campione:
# psycopg2
import psycopg2
connection = psycopg2.connect(database="DATABASE_ID",
host="PG_HOST",
port=PG_PORT)
cursor = connection.cursor()
cursor.execute('SELECT * FROM Singers')
for row in cursor:
print(row)
cursor.close()
connection.close()
# psycopg3
import psycopg
with psycopg.connect("host=PG_HOST port=PG_PORT dbname=DATABASE_ID sslmode=disable") as conn:
conn.autocommit = True
with conn.cursor() as cur:
cur.execute("SELECT * FROM Singers")
for row in cur:
print(row)
Node.js (node-postgres)
Puoi connetterti a PGAdapter utilizzando
node-postgres come se ti stessi
connettendo a un database PostgreSQL. Per connetterti ed eseguire query su una tabella in un database Spanner Omni, utilizza il seguente codice campione:
const { Client } = require('pg');
const client = new Client({
host: 'PG_HOST',
port: PG_PORT,
database: 'DATABASE_ID',
});
await client.connect();
const res = await client.query("SELECT * FROM Singers");
console.log(res.rows);
await client.end();