scala - 从 GCP SecretManagerServiceClient 获取秘密后关闭它
问题描述
如何在以下代码中关闭客户端:
object GoogleSecret {
def apply(
project: String,
version: String = SecretVersion,
credentials: CredentialsProvider = defaultProvider
): Try[SecretService] = Try {
require(project != null && project.nonEmpty, "project is null or empty")
val settings = SecretManagerServiceSettings.newBuilder
.setCredentialsProvider(credentialsProvider)
.build()
val client = SecretManagerServiceClient.create(settings)
logger.info(s"connected to project: $project")
secrets => secrets.flatMap {
secret =>
logger.debug(s"getting secret: $secret")
try {
val value = client
.accessSecretVersion(SecretVersionName.of(project, secret, version))
.getPayload
.getData
.toStringUtf8
Some(secret -> value)
} catch {
case e: Throwable => {
logger.error(s"google error ($secret): ${e.getMessage}")
client.shutdown()
client.awaitTermination(30, TimeUnit.SECONDS)
client.close()
None
}
}
}.toMap
}
上述方法创建一个客户端连接到 GCP Secret Manager,以获取秘密值,但我有一些问题:
- 这个片段应该做什么:
secrets => secrets.flatMap {
secret =>
logger.debug(s"getting secret: $secret")
try {
val value = client
.accessSecretVersion(SecretVersionName.of(project, secret, version))
.getPayload
.getData
.toStringUtf8
Some(secret -> value)
} catch {
case e: Throwable => {
logger.error(s"google error ($secret): ${e.getMessage}")
client.shutdown()
client.awaitTermination(30, TimeUnit.SECONDS)
client.close()
None
}
}
}.toMap
- 我如何转换代码以返回 Map[String, String] 中的秘密值,并关闭客户端连接(类似的东西):
def apply(
project: String,
version: String = SecretVersion,
credentials: CredentialsProvider = defaultProvider
): Try[SecretService] = Try {
.
.
.
some code with the solution
.
.
.
client.shutdown()
client.awaitTermination(30, TimeUnit.SECONDS)
client.close()
secrets
}
提前致谢 ;)
解决方案
如果我理解正确的话,你需要在拿到地图后关闭客户端
val client = SecretManagerServiceClient.create(settings)
// TODO: Set the type of the secrets parameter
val result = (secrets: ???) => { secrets.flatMap
...
}.toMap
}
client.shutdown()
client.awaitTermination(30, TimeUnit.SECONDS)
client.close()
return result
这里,result
是一个函数句柄,你要返回
但是,请记住,如果您到达异常块,客户端可能已经关闭
或者,您可以
- 将客户传递给函数,而不是项目详细信息。函数调用后关闭客户端
- 从函数定义中删除 Try,并实际处理异常或在成功时关闭客户端,然后返回
Some[Map]
推荐阅读
- c# - 尝试将 Google Analytics 连接到我们的应用程序时,“您应该避免使用此应用程序”
- amazon-web-services - 在策略资源中使用 AWS::Region
- xamarin - 如何检查用户何时输入 Xamarin Forms?
- c# - 方法“包含”的无重载采用列表和简单字符串的 2 个参数
- html - 列用作缩进边框的 CSS 网格布局未按预期工作
- c++ - 为什么 rax 寄存器被清零?
- performance - 为什么我的循环包含在一个缓存行中时要快得多?
- docker - npm install 在构建 docker 映像时返回连接超时
- google-picker - 如何在谷歌选择器中列出单个文件类型
- reactjs - 基于是否选中另一个复选框,对文本字段进行 React-hook-form 条件验证?