Dataflow Runner 与 GCP Secret Manager 存在问题

问题描述 投票:0回答:1

我有一个使用 Java 编码的 Apache Beam Dataflow 项目,其中我使用以下子例程来获取数据库凭据:

private static JsonObject getCredentials(String suffix) {
    String secretName = "projects/example-project/secrets/example_" + suffix + "/versions/latest";
    try (SecretManagerServiceClient client = SecretManagerServiceClient.create()) {
        SecretPayload payload = client.accessSecretVersion(secretName).getPayload();
        String secret_text = payload.getData().toStringUtf8();
        return JsonParser.parseString(secret_text).getAsJsonObject();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

这在我的开发机器上有效,但是当我使用 Dataflow Runner 在 GCP 上编译和运行时,出现以下错误:

来自worker的错误消息:java.lang.RuntimeException: org.apache.beam.sdk.util.UserCodeException: java.lang.RuntimeException: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException:PERMISSION_DENIED:权限 资源“secretmanager.versions.access”被拒绝 '项目/示例项目/秘密/example_server1/版本/最新' (或者它可能不存在)。

由于代码在我的开发机器上运行,我知道秘密的存在。我在我的开发计算机中以及触发数据流作业时使用相同的服务帐户凭据。为了更好地衡量,我什至将其设置为 IAM 中的 Secret Manager 管理员。

知道如何缩小问题范围并让我的数据流工作正常运行吗?

java google-cloud-platform apache-beam permission-denied google-secret-manager
1个回答
0
投票

我创建了一个服务帐户,以便通过一些 Python 脚本和 Java Apache Beam / Dataflow 访问 bigquery 和其他 GCP 资源。我还将服务帐户凭据 json 设置为我的开发机器默认应用程序凭据。

我假设需要向该服务帐户授予 Secret Manager 的权限。然而,虽然数据流作业是由该服务帐户触发的,但作业/工作人员的实际运行是由另一个服务帐户执行的。

我过滤了我的服务帐户并找到了“默认计算服务帐户”。将 Secret Manager Secret Accessor 角色设置为此服务帐户解决了我的问题,我的工作现在运行良好。

© www.soinside.com 2019 - 2024. All rights reserved.