将 SSL 证书与模板搭配使用

本页面介绍如何在 Dataflow 工作器虚拟机上暂存文件,以将 SSL 证书与 Google 提供的 Java Database Connectivity (JDBC) 模板搭配使用。您还可以按照本页中的步骤在工作器虚拟机上动态地暂存文件,然后再开始处理。

在工作器虚拟机上暂存文件

对于某些模板,您可以使用 extraFilesToStage 模板参数在 Dataflow 工作器虚拟机上暂存文件。使用此参数在工作器虚拟机上动态地暂存文件,然后再开始处理数据。您可能会在以下情况下使用此参数:

  • 在每个工作器上存储用于 SSL 连接的证书和密钥文件。
  • 由于 Dataflow 不包含对 Secret Manager 的内置支持,因此请使用此参数配置模板以存储和访问 Secret Manager Secret。

此参数仅在部分(而非全部)模板中可用。要查看参数是否可用于您使用的模板,请参阅Google 提供的 Dataflow 流处理模板Google 提供的 Dataflow 批处理模板中模板的模板参数表。

使用此参数时,以英文逗号分隔的 Cloud Storage 路径或 Secret Manager Secret 会传递给工作器,并将其保存在每个工作器的 /extra_files 目录中。将文件保存在 /extra_files 目录中时,其他参数可以引用它们。如需引用文件,请在配置属性中指定相对于 /extra_files 目录的文件路径。

使用此参数传递的所有 Cloud Storage 文件以相同的文件名存储在 /extra_files 目录中。Secret Manager Secret 存储在 /extra_files 目录中,并将 Secret 名称用作文件名。

例如,当您将 extraFilesToStage 设置为以下路径时,文件将存储在每个工作器的 /extra_files 目录中,文件名为 file.txtSECRET_ID

gs://BUCKET_NAME/file.txt,projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION_ID

配置 SSL 证书

对于使用 JDBC 读取或写入数据的模板,您可以使用 extraFilesToStage 模板参数将证书暂存为工作器虚拟机上的本地文件,然后在 JDBC 连接网址中或连接属性中引用本地文件名。

JDBC SSL 连接因数据库而异。本部分提供 PostgreSQL 和 MySQL 数据库的示例。

如果您需要设置 Java 系统属性,请使用 JvmInitializer。 您可以使用 JvmInitializer 对所有 Dataflow Java 工作器执行一次性初始化。

PostgreSQL

对于 PostgreSQL 数据库中的 SSL 连接,以下参数可用:sslsslmodesslcertsslkeysslrootcert

  • 要指定连接应使用 SSL 以及要使用的模式,请使用 sslsslmode 参数。
  • 对于客户端验证,请使用 sslcertsslkey 参数。
  • 对于服务器验证,请使用 sslrootcert 参数。

连接到 PostgreSQL 时,请设置以下参数:

extraFilesToStage=gs://BUCKET_NAME/root_cert.crt,gs://BUCKET_NAME/cert.crt,gs://BUCKET_NAME/key.key

connectionUrl=jdbc:postgresql://HOST/DATABASE?ssl=true&sslrootcert=/extra_files/root_cert.crt&sslcert=/extra_files/cert.crt&sslkey=/extra_files/key.key&OTHER_PARAMETERS...

如需查看其他 PostgreSQL JDBC 配置参数并详细了解这些参数,请参阅 JDBC PostgreSQL 文档中的连接参数

MySQL

对于 MySQL 数据库中的 SSL 连接,以下参数可用:sslmodetrustCertificateKeyStoreUrlclientCertificateKeyStoreUrl

  • 要指定连接应使用 SSL 和要使用的模式,请使用 sslmode 参数。
  • 对于客户端验证,请使用 clientCertificateKeyStoreUrl 参数。
  • 对于服务器验证,请使用 trustCertificateKeyStoreUrl 参数。

连接到 MySQL 时,请设置以下参数:

extraFilesToStage=gs://BUCKET_NAME/truststore.jks,gs://BUCKET_NAME/cert.crt,gs://BUCKET_NAME/keystore.jks

connectionUrl=jdbc:mysql://HOST/DATABASE?sslmode=REQUIRED&trustCertificateKeyStoreUrl=file:/extra_files/truststore.jks&sslcert=file:/extra_files/keystore.jks&OTHER_PARAMETERS...

如需查看其他 MySQL JDBC 配置参数并详细了解这些参数,请参阅 MySQL 文档中的安全连接器页面。

SSL 连接示例

以下示例演示了如何在 MySQL 数据库中运行具有 SSL 连接的 Pub/Sub to JDBC 模板。

#!/bin/bash

gcloud config set project PROJECT_ID

echo "Running template ..."
gcloud dataflow flex-template run my-job \
        --template-file-gcs-location="gs://dataflow-templates-REGION_NAME/latest/flex/Pubsub_to_Jdbc" \
--region="REGION" \
--parameters= \
driverClassName="com.mysql.jdbc.Driver",\
connectionUrl="jdbc:mysql://HOST/DATABASE?sslmode=REQUIRED&trustCertificateKeyStoreUrl=file:/extra_files/truststore.jks&sslcert=file:/extra_files/keystore.jks",\
driverJars="gs://BUCKET_NAME/mysql.jar",\
statement="INSERT INTO tableName (column1, column2) VALUES (?,?)",\
inputSubscription="projects/PROJECT_ID/subscriptions/subscription",\
outputDeadletterTopic="projects/PROJECT_ID/topics/topic",\
extraFilesToStage="gs://BUCKET_NAME/truststore.jks,gs://BUCKET_NAME/cert.crt,gs://BUCKET_NAME/keystore.jks"