Mit Apache Beam und SpannerIO eine Verbindung zu Spanner Omni herstellen

Apache Beam ist ein einheitliches Open-Source-Modell, mit dem sowohl Batch- als auch Streamingpipelines zur parallelen Datenverarbeitung ausgeführt werden können. In diesem Dokument wird beschrieben, wie Sie den SpannerIO-Connector in einer Apache Beam-Pipeline verwenden, um aus Spanner Omni-Datenbanken zu lesen oder in diese zu schreiben.

Hinweis

Damit Sie SpannerIO mit Spanner Omni verbinden können, müssen die folgenden Anforderungen erfüllt sein:

  • Datenbank in Ihrer Spanner Omni-Umgebung initialisieren

  • Wenn Sie die Verschlüsselung verwenden, achten Sie darauf, dass Sie eine kompatible Version von Apache Beam verwenden:

    • Für die TLS-Verschlüsselung: Version 2.69.0 oder höher.
    • Für die gegenseitige TLS-Verschlüsselung (mTLS) Version 2.75.0 oder höher.
  • Richten Sie Authentifizierungsdaten für Ihre Umgebung ein.

SpannerIO für die Verbindung mit Spanner Omni konfigurieren

Wenn Sie SpannerIO mit Spanner Omni verbinden möchten, konfigurieren Sie SpannerConfig mit Ihren Datenbankdetails und Verbindungsparametern.

Wählen Sie einen der folgenden Verbindungsmodi aus, um die Verbindung zu konfigurieren:

Verbindung über Nur-Text-Kommunikation herstellen

Wenn Sie eine Nur-Text-Verbindung herstellen möchten, geben Sie den Spanner Omni-Endpunkt an, aktivieren Sie die experimentelle Hostunterstützung mit der Methode withExperimentalHost() und konfigurieren Sie die Pipeline mit der Methode withUsingPlainTextChannel().

Das folgende Beispiel zeigt, wie eine Nur-Text-Verbindung konfiguriert wird:

SpannerConfig spannerConfig =
    SpannerConfig.create()
        .withDatabaseId("DATABASE_ID")
        // Define the Spanner Omni endpoint
        .withExperimentalHost("http://ENDPOINT")
        // Use a plain-text connection
        .withUsingPlainTextChannel(true);

Ersetzen Sie Folgendes:

  • DATABASE_ID: die ID Ihrer Spanner Omni-Datenbank, z. B. test-db.

  • ENDPOINT: der Endpunkt Ihrer Spanner Omni-Instanz, z. B. localhost:15000.

Verbindung über Verschlüsselung herstellen

Zum Schutz des Datenbank-Traffics und für eine sichere Kommunikation zwischen Apache Beam und Spanner Omni können Sie eine Verbindung über TLS- oder mTLS-Verschlüsselung herstellen. Durch die Verschlüsselung bleiben Ihre Anmeldedaten und Daten vertraulich.

TLS-Verschlüsselung verwenden

Wenn Sie den Datenbank-Traffic zwischen Apache Beam und Spanner Omni mit TLS-Verschlüsselung schützen möchten, müssen Sie in SpannerConfig keine Anmeldedatenattribute angeben. Konfigurieren Sie stattdessen einen Java-Truststore mit dem CA-Zertifikat von Spanner Omni und konfigurieren Sie dann die SpannerConfig für die Verwendung des sicheren TLS-Endpunkts.

Schritt 1: Java-Truststore konfigurieren

Um die Kommunikation zu sichern, müssen Sie das von Spanner Omni generierte CA-Zertifikat in einen Java-Truststore importieren. Verwenden Sie eine der folgenden Optionen:

Standard-Java-Truststore

Fügen Sie das von Spanner Omni generierte CA-Zertifikat dem Standard-Java-Truststore hinzu, indem Sie den folgenden Befehl ausführen:

sudo keytool -import -trustcacerts \
  -file ~/.spanner/certs/ca.crt \
  -alias spanner-ca \
  -keystore $JAVA_HOME/lib/security/cacerts

Benutzerdefinierter Truststore

Damit Ihre Pipeline weiterhin eine Verbindung zu anderen Datenbanken oder Diensten herstellen kann, die Standard-Zertifizierungsstellen verwenden, erstellen Sie einen benutzerdefinierten Truststore:

  1. Erstellen Sie einen benutzerdefinierten Truststore, indem Sie den vorhandenen Java-Truststore kopieren:

    cp $JAVA_HOME/lib/security/cacerts PATH_TO_CUSTOM_CA_CERTIFICATE
    
  2. Importieren Sie das CA-Zertifikat in Ihren benutzerdefinierten Truststore:

    keytool -import -trustcacerts \
      -file ~/.spanner/certs/ca.crt \
      -alias spanner-ca \
      -keystore PATH_TO_CUSTOM_CA_CERTIFICATE
    
  3. Übergeben Sie den benutzerdefinierten CA-Zertifikatsspeicher, wenn Sie die Pipeline ausführen:

    java -Djavax.net.ssl.trustStore=PATH_TO_CUSTOM_CA_CERTIFICATE \
      -Djavax.net.ssl.trustStorePassword=changeit \
      -jar PIPELINE_NAME.jar
    

Ersetzen Sie Folgendes:

  • PATH_TO_CUSTOM_CA_CERTIFICATE: der Pfad zu Ihrem benutzerdefinierten CA-Zertifikatsspeicher.

  • PIPELINE_NAME: der Name Ihrer Apache Beam-Pipeline.

Schritt 2: SpannerConfig konfigurieren

Wenn Sie SpannerConfig für die Verwendung einer sicheren TLS-Verbindung konfigurieren möchten, fügen Sie Ihrer Pipeline den folgenden Code hinzu:

SpannerConfig spannerConfig =
    SpannerConfig.create()
        .withDatabaseId("DATABASE_ID")
        // Define the secure Spanner Omni endpoint
        .withExperimentalHost("https://ENDPOINT");

Ersetzen Sie Folgendes:

  • DATABASE_ID: die ID Ihrer Spanner Omni-Datenbank, z. B. test-db.

  • ENDPOINT: der Endpunkt Ihrer Spanner Omni-Instanz, z. B. localhost:15000.

mTLS-Verschlüsselung verwenden

Wenn Sie eine gegenseitige TLS-Verbindung (mTLS) mit Apache Beam herstellen möchten, müssen Sie den Java-Truststore mit dem CA-Zertifikat konfigurieren, einen privaten Client-Schlüssel generieren oder in das PKCS#8-Format konvertieren und dann SpannerConfig mit dem Client-Zertifikat und dem Schlüsselpfad konfigurieren.

Schritt 1: Java-Truststore konfigurieren

Konfigurieren Sie den Java-Truststore mit dem Spanner Omni-CA-Zertifikat, wie zuvor in diesem Dokument unter Schritt 1: Java-Truststore konfigurieren beschrieben.

Schritt 2: Privaten Clientschlüssel konvertieren oder generieren

Wenn Sie eine Verbindung über mTLS herstellen möchten, muss der private Schlüssel des Clients im PKCS#8-Format vorliegen. Verwenden Sie eine der folgenden Optionen:

openssl

Führen Sie den folgenden Befehl aus, um den von Spanner Omni generierten Clientschlüssel in ein Java-kompatibles Format zu konvertieren:

openssl pkcs8 -topk8 \
  -in ~/.spanner/certs/client.key \
  -out ~/.spanner/certs/java-client.key \
  -nocrypt

Spanner Omni-Befehlszeile

Generieren Sie den Schlüssel direkt im PKCS#8-Format, wenn Sie Ihr Clientzertifikat mit der Spanner Omni CLI und dem Flag --generate-pkcs8-key erstellen.

Führen Sie den folgenden Befehl aus, um ein Clientzertifikat und einen privaten Schlüssel im PKCS#8-Format zu generieren:

spanner certificates create-client CLIENT_NAME \
  --ca-certificate-directory=PATH_TO_CA_CERTIFICATES \
  --ca-private-key-directory=PATH_TO_PRIVATE_KEYS \
  --output-directory=PATH_TO_CERTIFICATES \
  --generate-pkcs8-key

Ersetzen Sie Folgendes:

  • CLIENT_NAME: der Name des Clients, für den das Zertifikat und der private Schlüssel generiert werden sollen.

  • PATH_TO_CA_CERTIFICATES: der Pfad zum Verzeichnis, das die CA-Zertifikate enthält.

  • PATH_TO_PRIVATE_KEYS: der Pfad zum Verzeichnis, das die privaten Schlüssel der Zertifizierungsstelle enthält.

  • PATH_TO_CERTIFICATES: der Pfad zum Verzeichnis, in dem das Clientzertifikat und der private Schlüssel gespeichert sind.

Schritt 3: SpannerConfig konfigurieren

Konfigurieren Sie die SpannerConfig in Ihrem Pipelinecode mit dem Clientzertifikat und dem privaten Schlüssel des Clients:

SpannerConfig spannerConfig =
    SpannerConfig.create()
        .withDatabaseId("DATABASE_ID")
        // Define the secure Spanner Omni endpoint
        .withExperimentalHost("https://ENDPOINT")
        // Specify the paths to the client certificate and private key
        .withClientCert(
            "PATH_TO_CLIENT_CERT",
            "PATH_TO_CLIENT_CERT_KEY");

Ersetzen Sie Folgendes:

  • DATABASE_ID: die ID Ihrer Spanner Omni-Datenbank, z. B. test-db.

  • ENDPOINT: der Endpunkt Ihrer Spanner Omni-Instanz, z. B. localhost:15000.

  • PATH_TO_CLIENT_CERT: der Pfad zu Ihrer Clientzertifikatsdatei.

  • PATH_TO_CLIENT_CERT_KEY: der Pfad zur privaten Schlüsseldatei des Clients.

Authentifizierungstokens konfigurieren

Authentifizierungstokens werden für die Verwendung durch Clients nicht empfohlen, da die von Spanner Omni generierten Tokens ablaufen und manuell mit der Spanner Omni CLI erneuert werden müssen. Wenn Sie ein Authentifizierungstoken mit einer TLS- oder mTLS-Einrichtung für einen Spanner Omni-Endpunkt verwenden möchten, setzen Sie die Umgebungsvariable SPANNER_EXPERIMENTAL_HOST_AUTH_TOKEN auf den Wert des Authentifizierungstokens, das von der Spanner Omni CLI generiert wurde. Lassen Sie diese Variable für Verbindungen, für die keine Anmeldedaten erforderlich sind, ungesetzt.

Nächste Schritte