【问题标题】:How to manage properties and secret values in Dataflow Java pipelines?如何管理 Dataflow Java 管道中的属性和秘密值?
【发布时间】:2021-04-11 06:57:44
【问题描述】:

我有一些用 Java 编写的 Dataflow 管道,它们在不同环境/项目(开发、UAT、生产)中的 GCP 上运行。目前,环境配置(主要是 Cloud SQL 实例和 BigQuery 数据集的连接参数)使用 Java 类(键 = env,值 = 属性映射)中的静态映射和用于从 Cloud Storage 动态加载其他文件的实用程序类进行管理.

在这种情况下管理配置的最佳做法(如果有的话)是什么?

本质上,我看到了两种配置参数:

  • 纯值(在 Spring 应用程序中您将存储在纯属性文件中的东西)
  • 秘密值(包含必须加密的数据的属性文件 - 数据库的用户名/密码、API 密钥 - 在 K8S 上下文中可以作为秘密挂载的东西)

谢谢。

【问题讨论】:

    标签: java google-cloud-platform configuration google-cloud-dataflow apache-beam


    【解决方案1】:

    我认为您会发现本教程对如何Access Secret Manager from Dataflow Pipeline 很有帮助

    “截至今天,Dataflow 不提供对存储和 访问秘密。为了保护这些秘密,常见的方法是 运行时使用 Cloud KMS 加密和解密 数据管道。有了新推出的 Secret Manager,我们现在可以 将这些秘密存储在 Secret Manager 中并从我们的 管道以提供更好的安全性和易用性。”

    以下代码使用 Secret Manager SDK 访问给定 JDBC URL 密钥名称的密钥。

    
    private static String jdbcUrlTranslator(String jdbcUrlSecretName) {
      try (SecretManagerServiceClient client = SecretManagerServiceClient.create()) {
        AccessSecretVersionResponse response = client.accessSecretVersion(jdbcUrlSecretName);
    
        return response.getPayload().getData().toStringUtf8();
      } catch (IOException e) {
        throw new RuntimeException("Unable to read JDBC URL secret");
      }
    }
    
    public static void main(String[] args) {
      PipelineOptionsFactory.register(MainPipelineOptions.class);
    
      MainPipelineOptions options =
          PipelineOptionsFactory.fromArgs(args)
              .withValidation()
              .as(MainPipelineOptions.class);
    
      NestedValueProvider<String, String> jdbcUrlValueProvider =
          NestedValueProvider.of(
              options.getJdbcUrlSecretName(), MainPipeline::jdbcUrlTranslator);
    
      Pipeline pipeline = Pipeline.create(options);
    
      pipeline
          .apply("SQL Server - Read Sales.Customers_Archive",
              JdbcIO.<KV<Integer, String>>read()
                  .withDataSourceConfiguration(
                      JdbcIO.DataSourceConfiguration.create(
                          StaticValueProvider.of("com.microsoft.sqlserver.jdbc.SQLServerDriver"),
                          jdbcUrlValueProvider)
                  );
      
      // Other transforms
    
      pipeline.run();
    }
    

    【讨论】:

      【解决方案2】:

      在 Google Cloud Platform 中处理秘密值的一种方法是使用 Secret Manager 处理对存储密码的加密和访问控制。

      在您的 Java 代码中,您可以使用 Google Cloud Secret Manager maven 模块来获取秘密值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        • 2022-12-12
        • 1970-01-01
        • 2021-10-07
        • 2019-11-03
        • 2022-08-16
        相关资源
        最近更新 更多