Dokumen ini menjelaskan cara terhubung ke Spanner Omni menggunakan PGAdapter. Anda mengonfigurasi PGAdapter untuk membuat koneksi aman. PGAdapter mendukung mode keamanan teks biasa, Transport Layer Security (TLS), dan TLS mutual (mTLS). Mode ini melindungi data Anda selama transmisi dengan memberikan berbagai tingkat enkripsi dan autentikasi. Setiap mode keamanan memerlukan konfigurasi klien tertentu untuk memastikan integritas dan kerahasiaan data.
Anda dapat menjalankan PGAdapter sebagai proses mandiri atau mengintegrasikannya langsung ke dalam aplikasi Anda. Untuk pengelolaan interaktif dan eksekusi kueri manual, hubungkan ke
database Anda menggunakan alat PostgreSQL standar seperti psql. Untuk membangun aplikasi otomatis, gunakan driver yang kompatibel dengan PostgreSQL seperti berikut:
pgxuntuk Gopsycopg3untuk Pythonnode-postgresuntuk Node.js
Untuk contoh kode yang menggunakan beberapa driver ini, lihat contoh kode dalam dokumen ini.
Mode keamanan
Spanner Omni PGAdapter mendukung tiga mode keamanan, yang menentukan cara komunikasi dienkripsi dan diautentikasi antara PGAdapter dan database. Untuk menggunakan mode ini, konfigurasi opsi klien seperti yang dijelaskan dalam tabel berikut:
| Mode keamanan | Deskripsi |
|---|---|
| Teks biasa | Komunikasi tidak dienkripsi. |
| TLS | Komunikasi dienkripsi menggunakan Transport Layer Security (TLS). Mode ini mengharuskan Anda menambahkan sertifikat CA Spanner Omni ke truststore Java default. |
| mTLS | Komunikasi dienkripsi menggunakan TLS timbal balik (mTLS). Mode ini mengharuskan Anda memberikan sertifikat klien dan kunci pribadi klien. |
Menjalankan sebagai proses mandiri
Jalankan PGAdapter sebagai proses mandiri untuk aplikasi non-Java dan untuk alat PostgreSQL standar, misalnya, psql, saat Anda memerlukan interaksi database manual. Pendekatan ini memisahkan proxy dari siklus proses aplikasi Anda,
yang memungkinkan Anda mengelola dan memperbaruinya secara terpisah. Untuk memulai PGAdapter sebagai proses mandiri, gunakan metode konfigurasi berikut berdasarkan mode keamanan yang Anda pilih.
Menggunakan mode teks biasa
Untuk memulai PGAdapter dalam mode komunikasi teks biasa, jalankan perintah berikut:
java -jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "isExperimentalHost=true;usePlainText=true"
Ganti kode berikut:
DATABASE_ID: ID database Spanner Omni Anda, misalnya,test-db.ENDPOINT: endpoint instance Spanner Omni Anda, misalnya,localhost:15000.
Menggunakan mode TLS
Sebelum dapat memulai PGAdapter dalam proses dalam mode TLS dengan aplikasi Java, Anda harus menambahkan sertifikat CA Spanner Omni ke truststore Java default. Untuk menambahkan sertifikat CA yang ada ke truststore Java, jalankan perintah berikut:
sudo keytool -import -trustcacerts -file ~/.spanner/certs/ca.crt -alias spanner-ca -keystore $JAVA_HOME/lib/security/cacerts
Untuk memulai PGAdapter dalam mode TLS, jalankan perintah berikut:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts \
-Djavax.net.ssl.trustStoreType=JKS \
-jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "isExperimentalHost=true"
Menggunakan mode mTLS
Sebelum dapat memulai PGAdapter dalam mode mTLS, Anda harus memastikan bahwa kunci klien Anda dalam format PKCS#8. Untuk mengonversi kunci yang ada di keystore Anda ke format PKCS#8, jalankan perintah berikut:
openssl pkcs8 -topk8 -in ~/.spanner/certs/client.key -out ~/.spanner/certs/java-client.key -nocrypt
Atau, saat Anda membuat sertifikat dan kunci klien menggunakan
Spanner Omni CLI, berikan parameter --generate-pkcs8-key untuk membuat
kunci dalam format PKCS#8.
Untuk memulai PGAdapter dalam mode mTLS, jalankan perintah berikut:
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts \
-Djavax.net.ssl.trustStoreType=JKS \
-jar pgadapter.jar \
-d DATABASE_ID \
-e ENDPOINT \
-r "isExperimentalHost=true;clientCertificate=PATH_TO_CLIENT_CERT;clientKey=PATH_TO_CLIENT_KEY"
Ganti kode berikut:
PATH_TO_CLIENT_CERT: jalur ke file sertifikat klien Anda.PATH_TO_CLIENT_KEY: jalur ke file kunci klien Anda.
Terhubung dengan psql
Setelah Anda membuat koneksi menggunakan salah satu metode sebelumnya, jalankan psql
untuk mengelola database dan menjalankan kueri. Untuk terhubung ke psql, gunakan
perintah berikut:
psql -h PG_HOST -p PG_PORT -U USERNAME -d DATABASE_ID
Ganti kode berikut:
PG_HOST: nama host atau alamat IP mesin tempat PGAdapter dijalankan. Jika dijalankan secara lokal, gunakanlocalhost.PG_PORT: nomor port tempat PGAdapter dijalankan. Jika Anda belum menentukan port kustom, PGAdapter akan menggunakan port5432secara default.USERNAME: nama pengguna PostgreSQL Anda.
Menjalankan dalam proses dengan aplikasi Anda
Anda juga dapat memulai PGAdapter dalam proses dengan aplikasi Anda. Untuk membuat
keamanan, konfigurasi objek OptionsMetadata.
Menggunakan mode teks biasa
Untuk komunikasi teks biasa, seperti pengembangan lokal atau pengujian di lingkungan yang aman yang tidak memerlukan overhead enkripsi, gunakan konfigurasi berikut:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.setUsePlainText();
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
Menggunakan mode TLS
Untuk komunikasi teks biasa yang digunakan di lingkungan seperti pengembangan atau pengujian lokal, gunakan konfigurasi berikut:
sudo keytool -import -trustcacerts -file /.spanner/certs/ca.crt -alias spanner-ca -keystore $JAVA_HOME/lib/security/cacerts
Untuk membuat koneksi TLS dalam proses, gunakan konfigurasi berikut:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT");
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
Menggunakan mode mTLS
Sebelum dapat memulai mode dalam proses PGAdapter dengan aplikasi Java, Anda harus memastikan kunci klien Anda dalam format PKCS#8. Untuk mengonversi kunci yang ada di keystore Anda ke format PKCS#8, jalankan perintah berikut:
openssl pkcs8 -topk8 -in ~/.spanner/certs/client.key -out ~/.spanner/certs/java-client.key -nocrypt
Atau, saat Anda membuat sertifikat dan kunci klien menggunakan
Spanner Omni CLI, berikan parameter --generate-pkcs8-key untuk membuat
kunci dalam format PKCS#8.
Untuk membuat koneksi mTLS dalam proses, gunakan konfigurasi ini:
OptionsMetadata.Builder builder =
OptionsMetadata.newBuilder()
.setEndpoint("ENDPOINT")
.useClientCert("PATH_TO_CLIENT_CERT", "PATH_TO_CLIENT_KEY");
ProxyServer server = new ProxyServer(builder.build());
server.startServer();
server.awaitRunning();
Kode contoh
Bagian ini memberikan contoh kode untuk menghubungkan ke database Spanner Omni menggunakan driver yang kompatibel dengan PostgreSQL berikut:
Ganti placeholder berikut dalam string koneksi Anda:
- PASSWORD: sandi untuk pengguna PostgreSQL Anda.
JDBC
Anda dapat terhubung ke PGAdapter menggunakan driver JDBC PostgreSQL seolah-olah Anda terhubung ke database PostgreSQL. Untuk menghubungkan dan membuat kueri tabel di database Spanner Omni, gunakan contoh kode berikut:
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)
Anda dapat terhubung ke PGAdapter menggunakan pgx seolah-olah Anda terhubung ke database PostgreSQL. Gunakan contoh kode berikut:
// 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 atau psycopg3)
Anda dapat terhubung ke PGAdapter menggunakan psycopg2 atau psycopg3 seolah-olah Anda
terhubung ke database PostgreSQL. Untuk menghubungkan dan membuat kueri tabel di database Spanner Omni, gunakan contoh kode berikut:
# 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)
Anda dapat terhubung ke PGAdapter menggunakan
node-postgres seolah-olah Anda
terhubung ke database PostgreSQL. Untuk menghubungkan dan membuat kueri tabel di database Spanner Omni, gunakan contoh kode berikut:
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();