如何在已部署的 Cloud Run Service(托管)中使用 Google Secret?

xet*_*a11 13 google-cloud-run google-secret-manager

我有一个正在运行的云运行服务user-service。出于测试目的,我通过环境变量以纯文本形式传递客户端机密。现在,由于一切正常,我想使用一个秘密。

在“编辑修订版”选项的“变量”选项卡中,我可以声明环境变量,但我不知道如何传递秘密?我是否只需要像${my-secret-id}变量的值字段中那样传递秘密名称?没有关于如何在此选项卡中使用机密的文档,只有顶部的提示:

Store and consume secrets using Secret Manager
Run Code Online (Sandbox Code Playgroud)

在这种情况下这不是很有帮助。

Mar*_*der 9

您现在可以从 Secret Manager 中读取机密作为 Cloud Run 中的环境变量。这意味着您可以审核您的机密、设置每个机密的权限、版本机密等,并且您的代码无需更改。

您可以通过 Cloud Console GUI (console.cloud.google.com) 指向机密,或者在从命令行部署 Cloud Run 服务时进行配置:

gcloud beta run deploy SERVICE --image IMAGE_URL --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION
Run Code Online (Sandbox Code Playgroud)

六分钟视频概述: https: //youtu.be/JIE89dneaGo

详细文档: https: //cloud.google.com/run/docs/configuring/secrets


buf*_*low 4

2021 年更新:现在有一个 Cloud Run 预览版,用于将机密加载到环境变量或卷。 https://cloud.google.com/run/docs/configuring/secrets

现在问题已经得到解答,但是我在使用带有 Java 和 Quarkus 的 Cloud Run 以及使用 GraalVM 创建的本机映像时遇到了类似的问题。

虽然在撰写本文时 Cloud Run 是一项非常有趣的技术,但它缺乏通过 Cloud Run 配置加载机密的能力。在进行本地开发时,这无疑增加了我的应用程序的复杂性。

另外谷歌的文档确实很差。快速入门缺少一个清晰的 Java 示例来获取秘密[1],而无需使用相同的方法进行设置 - 我希望这是最常见的用例!

javadoc 本身似乎很大程度上是使用 protobuf 语言自动生成的。有各种类似命名的方法,例如getSecret,getSecretVersionaccessSecretVersion

我真的很希望看到谷歌在这方面做出一些改进。我认为对于专门的团队来说,为通用语言创建具有适当文档的库并不过分。

这是我用来加载此信息的一个片段。它需要 GCP Secret 库和 GCP Cloud Core 库来加载项目 ID。

public String getSecret(final String secretName) {
    LOGGER.info("Going to load secret {}", secretName);

    // SecretManagerServiceClient should be closed after request
    try (SecretManagerServiceClient client = buildClient()) {
        // Latest is an alias to the latest version of a secret
        final SecretVersionName name = SecretVersionName.of(getProjectId(), secretName, "latest");
        return client.accessSecretVersion(name).getPayload().getData().toStringUtf8();
    }
}

private String getProjectId() {

    if (projectId == null) {
        projectId = ServiceOptions.getDefaultProjectId();
    }

    return projectId;
}

private SecretManagerServiceClient buildClient() {
    try {
        return SecretManagerServiceClient.create();
    } catch(final IOException e) {
        throw new RuntimeException(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

[1] - https://cloud.google.com/secret-manager/docs/reference/libraries