`IAM_PERMISSION_DENIED`,但在本地主机上没有错误

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

当我检查 GCP 中已部署容器的日志时,我收到了

error details: name = ErrorInfo reason = IAM_PERMISSION_DENIED domain = iam.googleapis.com metadata = map[permission:logging.logEntries.create]
。我不确定为什么会发生这种情况,因为在本地主机中运行容器似乎工作正常。

该服务也与另一个服务部署在同一主机上,但端口号不同,另一个服务似乎工作正常,尽管它没有使用任何谷歌API服务。

GCP 上出现错误的服务有一个包含以下内容的

.env
文件:

GOOGLE_APPLICATION_CREDENTIALS=json/name-of-json-file.json

json 文件是服务帐户密钥文件。 dockerfile 看起来像这样:

# Specifies a parent image
FROM golang:1.19.2-bullseye

# Creates an app directory to hold your app’s source code
WORKDIR /app

# Copies everything from your root directory into /app
COPY . .

# Installs Go dependencies
RUN go mod download

# Builds your app with optional configuration
RUN go build -o /logging-go

# Tells Docker which network port your container listens on
EXPOSE 8040

# Specifies the executable command that runs when the container starts
CMD [ "/logging-go" ]

该服务正在利用谷歌日志记录 API,并通过以下代码片段进行访问:

    c, cErr := Load(".env")
    if cErr != nil {
        log.Fatalf("could not load config: %s", cErr)
        return
    }

    // initializes logger which writes to stdout
    ctx := context.Background()
    opt := option.WithCredentialsFile(c.GoogleApplicationCredentials);
    loggerClient, clientErr := logging.NewClient(ctx, "poc-projects-01", opt)
    if clientErr != nil {
        log.Fatal(clientErr)
    }

    if clientErr := loggerClient.Ping(ctx); clientErr != nil {
        log.Fatal(clientErr)
    }

    logger := loggerClient.Logger("frontend_logs")

通过 docker 运行它时,它在我的本地主机上运行良好,但在 GCP 上不起作用。关于如何解决这个问题有什么想法吗?

docker go google-cloud-platform deployment dockerfile
3个回答
2
投票

我知道我对服务帐户密钥拥有正确的权限,甚至让一位 DevsOps 人员为我创建了一个,但它仍然无法正常工作。我发现使用默认服务帐户密钥最终可以在 GCP 上运行。


0
投票

错误详细信息:名称 = ErrorInfo 原因 = IAM_PERMISSION_DENIED 域 = iam.googleapis.com 元数据 = 地图[权限:logging.logEntries.create]

上述错误意味着您在尝试从部署的容器访问 Google Logging API 时遇到权限问题。如果您使用的服务帐户密钥没有访问 API 的正确权限,或者服务帐户密钥尚未正确配置,则可能会发生这种情况。

为了确保服务帐户密钥具有正确的权限,您应该检查与服务帐户关联的 IAM 角色,并确保这些角色具有访问 Google Logging API 的正确权限,检查您是否具有 '

 logging.logEntries.create
' 分配给您的服务帐户的角色。

附上故障排除文档以供参考。


0
投票

我已经设置了所有权限并且正在发送通知,但是,即使服务器配置为每 10 分钟替换一次 oauth2 令牌(自从 Google 拒绝透露令牌有效性时间以来我发明的任意值),每次过了一会儿,我的 HTTP v1 通知只会返回

Error 403 IAM_PERMISSION_DENIED
,直到我替换了 oauth2 令牌。

有什么想法吗?我正在考虑为每个通知请求一个 oauth2 令牌,即使我的社交媒体应用程序中每分钟都会发送数十个通知,这对于所需的 REST API 调用数量以及无用的延迟而言是不切实际的会引入 oauth2 令牌的不断刷新。

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