我有一些用Java编写的数据流管道,它们在不同的环境/项目(开发、UAT、生产(中运行在GCP上。目前,环境配置(主要是Cloud SQL实例和BigQuery数据集的连接参数(是使用Java类中的静态映射(key=env,value=map of properties(和实用程序类来管理的,以便从Cloud Storage动态加载其他文件。
在这种情况下,管理配置的最佳实践(如果有的话(是什么?
本质上,我看到两种配置参数:
- 纯值(在Spring应用程序中,您可以将其存储在纯属性文件中(
- secret值(包含必须加密的数据的属性文件-数据库的用户名/密码、API密钥-在K8S上下文中可以安装为secret的内容(
谢谢。
我想您会发现本教程对如何从Dataflow Pipeline 访问Secret Manager很有帮助
"到目前为止,Dataflow还没有为存储和访问机密。为了保护这些秘密,常见的方法是在运行数据管道。有了新推出的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();
}
在谷歌云平台内处理秘密值的一种方法是使用秘密管理器处理对存储密码的加密和访问控制。
在您的Java代码中,您可以使用Google Cloud Secret Manager maven模块来获取所需的机密值