从 GCP SecretManagerServiceClient 获取秘密后关闭它

Posted

技术标签:

【中文标题】从 GCP SecretManagerServiceClient 获取秘密后关闭它【英文标题】:Close GCP SecretManagerServiceClient after getting secrets from it 【发布时间】:2021-10-25 06:06:00 【问题描述】:

如何在下面的代码中关闭客户端:

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


提前致谢;)

【问题讨论】:

您可能想看看像 cats-effectZIO 这样的效果系统,它们提供了一种更安全的资源管理方式。跨度> 【参考方案1】:

如果我理解正确的话,你拿到地图后需要关闭客户端

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]

【讨论】:

感谢您的帮助,但是,不起作用,我收到此错误:[error] val result = secrets => secrets.flatMap [error] ^ [error] 发现一个错误 [error] ( Compile / compileIncremental) 编译失败 你可能需要像val result = (secrets: List[String]) => secrets.flatMap secret => .toMap 这样的东西

以上是关于从 GCP SecretManagerServiceClient 获取秘密后关闭它的主要内容,如果未能解决你的问题,请参考以下文章

将文件从 GCP 复制到 docker 容器

将 Kubernetes 应用程序从 AWS 迁移到 GCP

从 GCP 下载 Gmaps 样式

从存储桶复制 GCP 文件失败,无法访问元数据服务

不使用 gcloud 实用程序从 docker 容器访问 GCP 云存储桶

如何将消息从 GCP 推送订阅传递到本地 PC?