如何在GCP Appengine上设置GOOGLE_APPLICATION_CREDENTIALS运行

10
我正在使用Windows运行本地App Engine来开发我的Golang项目。我遇到了googleapi:Error 403报错:Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/xxxx/locations/xxxx/keyRings/xxx/cryptoKeys/xxx'(或者它可能不存在). 我通过设置环境变量GOOGLE_APPLICATION_CREDENTIALS为服务账户xxxx.json的值,解决掉了这个问题。后来在GCP App Engine上部署时,出现了相同的错误googleapi:Error 403.....。那么如何在GCP App Engine中设置GOOGLE_APPLICATION_CREDENTIALS呢?
4个回答

13

你面临的问题是在两个环境中开发/测试:你的桌面和App Engine。这个问题很容易以一种清晰且安全的方式解决。

在桌面上进行开发/测试时,请使用服务帐户。使用环境变量指定服务帐户。

在Windows上:

set GOOGLE_APPLICATION_CREDENTIALS=c:\fullpath\serviceaccount.json

在Linux上:

export GOOGLE_APPLICATION_CREDENTIALS=/fullpath/serviceaccount.json

您可以手动在命令提示符中运行前面的命令,或将其放入启动脚本(Linux)或系统环境变量(Windows)中。

对于App Engine,我不建议在您的应用程序中使用服务帐户文件。 我也不建议设置环境变量。

Google客户端库支持应用程序默认凭据(ADC)。这意味着库将尝试自动查找凭据。然后,客户端库可以在 Windows 上使用环境来查找要使用的服务帐户,并在部署时自动使用App Engine的默认服务帐户。

Google Cloud 应用程序默认凭据

通过在代码中包含 ADC,您可以在 Windows / Linux 上进行测试并部署到 App Engine,而无需修改代码,并且还避免了在部署中包含服务账户 JSON 文件所带来的安全风险。


@NiklasR。对于Google App Engine标准版,不需要环境变量。Google客户端从分配给App Engine的默认服务帐户获取凭据。此链接提供更多信息:https://cloud.google.com/appengine/docs/standard/python3/service-account - John Hanley
这是现代工程的又一个例子,只有90%或更少的功能实际上起作用。ADC无法用于生成Google Cloud Storage签名URL。为此,您需要完整的JSON。而App Engine不允许您设置GOOGLE_APPLICATION_CREDENTIALS。我已经检查过了。在AE Docker镜像中,我设置的每个环境变量都存在,除了那个。我想我必须找到一种方法将我的笔记本电脑连接到生产环境,以便它可以签署URL。 - Throw Away Account
@ThrowAwayAccount - 签署数据有两种方法。第一种是使用JSON密钥材料中的RSA私钥。当私钥不可用时,您可以使用IAM SignBlob API。API在这里。该功能在Google Cloud SDK中适用于所有支持的语言,并且还可以通过简单的HTTP REST请求进行支持。使用IAM方法是安全的,因为不需要服务帐号JSON密钥材料,并且优先于使用RSA私钥。 - John Hanley
@ThrowAwayAccount - 如果你在Stack Overflow上搜索,你会看到支持RSA和IAM签名方法的Signed URL示例。如果你理解底层服务,这是一个非常简单的问题要解决。选择哪种方法取决于你的安全需求。如果你遇到问题,请提出一个问题。我们可以帮助你找到一个好的解决方案。 - John Hanley
@ThrowAwayAccount - 如果你在Stack Overflow上搜索,你会看到支持RSA和IAM签名方法的签名URL示例。如果你理解底层服务,这是一个非常简单的问题可以解决。选择哪种方法取决于你的安全需求。如果你遇到问题,请提出一个问题。我们可以帮你找到一个好的解决方案。 - undefined

0
另一个答案:
在您的控制台中,在 IAM -> 服务帐户下,您将能够找到与您的应用引擎实例相关联的服务帐户:

enter image description here

您可以通过UI或命令行编辑权限。

有时候通过UI更容易操作。


默认情况下,App Engine 默认服务帐户在项目中已经具有编辑器角色,并且对该项目中的所有资源具有读写访问权限。 - YaguraStation
@Daniel Lee让我通过将“Editor”角色赋予服务帐户来完成。 - THIYAGARAJAN SR
@Daniel Lee,我被授权给xxx-xxx@appspot.gserviceaccount.com服务帐户的Editor角色,但仍然收到“googleapi: Error 403: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/xxxxxxxx/locations/xxxxxx/keyRings/xxx/cryptoKeys/xxx'(或者它可能不存在)。”的错误提示。禁止访问。 - THIYAGARAJAN SR
1
@THIYAGARAJAN SR,尝试添加此角色:cloudkms.cryptoKeyEncrypterDecrypter,该角色具有此特定功能。 Editor 角色将无法为您提供足够的权限来执行此操作。 - Ralemos

0

目前来看,设置GOOGLE_APPLICATION_CREDENTIALS=key.json似乎不起作用。 以下是您可以执行的操作。 在中运行此命令

gcloud auth application-default login

它将自动设置应用程序的默认密钥


0

您需要设置 IAM 权限才能使用加密功能。

您可以使用以下命令及您的服务帐户详细信息来完成设置:

gcloud kms keys add-iam-policy-binding \
  golden-egg --location global --keyring golden-goose \
  --member serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
  --role roles/cloudkms.cryptoKeyEncrypterDecrypter

这里有一个社区帖子,已经涉及到了这个主题,并且可以为您提供更多的信息和文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接