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 definiert werden können. In diesem Dokument wird beschrieben, wie Sie den SpannerIO-Connector in einer Apache Beam-Pipeline verwenden, um Daten aus Spanner Omni-Datenbanken zu lesen oder in sie zu schreiben.

Hinweis

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

  • Initialisieren Sie eine Datenbank in Ihrer Spanner Omni-Umgebung.

  • Wenn Sie die Verschlüsselung verwenden, muss eine kompatible Version von Apache Beam verwendet werden:

    • 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 Authentifizierungsanmeldedaten für Ihre Umgebung ein.

SpannerIO für die Verbindung zu Spanner Omni konfigurieren

Konfigurieren Sie SpannerConfig mit Ihren Datenbankdetails und Verbindungsparametern, um SpannerIO mit Spanner Omni zu verbinden.

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

Verbindung über Nur-Text-Kommunikation

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(), um eine Nur-Text-Verbindung herzustellen.

Im folgenden Beispiel wird gezeigt, 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

Um den Datenbanktraffic zu schützen und eine sichere Kommunikation zwischen Apache Beam und Spanner Omni zu gewährleisten, 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 Datenbanktraffic zwischen Apache Beam und Spanner Omni mit TLS-Verschlüsselung schützen möchten, müssen Sie in SpannerConfig keine Anmeldedateneigenschaften angeben. Konfigurieren Sie stattdessen einen Java-Truststore mit dem Spanner Omni-CA-Zertifikat und konfigurieren Sie dann SpannerConfig so, dass der sichere TLS-Endpunkt verwendet wird.

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. Führen Sie dazu den folgenden Befehl aus:

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 Standardzertifizierungsstellen (CAs) 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-Zertifikatspeicher, 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-Zertifikatspeicher.

  • PIPELINE_NAME: der Name Ihrer Apache Beam-Pipeline.

Schritt 2: SpannerConfig konfigurieren

Fügen Sie den folgenden Code zu Ihrer Pipeline hinzu, um SpannerConfig für die Verwendung einer sicheren TLS-Verbindung zu konfigurieren:

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

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

Schritt 1: Java-Truststore konfigurieren

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

Schritt 2: Privaten Clientschlüssel konvertieren oder generieren

Wenn Sie eine Verbindung über mTLS herstellen möchten, muss Ihr privater Clientschlüssel 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 mit Java kompatibles Format zu konvertieren:

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

Spanner Omni-Kommandozeile

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

Führen Sie den folgenden Befehl aus, um ein Clientzertifikat und einen privaten Clientschlü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 mit den CA-Zertifikaten.

  • PATH_TO_PRIVATE_KEYS: der Pfad zum Verzeichnis mit den privaten CA-Schlüsseln.

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

Schritt 3: SpannerConfig konfigurieren

Konfigurieren Sie SpannerConfig in Ihrem Pipelinecode mit dem Clientzertifikat und dem privaten Clientschlüssel:

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 zu Ihrer privaten Clientschlüsseldatei.

Authentifizierungstokens konfigurieren

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

Nächste Schritte