如何允许用户在没有 public 访问权限的情况下从 Compute Engine 下载 Google 云存储文件

How to allow a user to download a Google Cloud Storage file from Compute Engine without public access

我会尽量保持简短。

我有一个计算引擎实例,它是 运行 Python/Flask。

我想做的是允许用户从 google 云存储下载文件,但我不希望该文件可公开访问。有没有办法让我的计算实例从云存储中流式传输文件供用户下载,然后在用户完成文件下载后从计算实例中删除文件?我希望在他们单击下载按钮后立即开始下载。

我正在使用默认的应用凭据。 子进程不是一个选项。

旁注: 我考虑这样做的另一种方法是允许每个登录网站的用户访问存储桶上的特定文件夹。但是,我不确定如果不让他们使用 google 帐户登录,这是否可行。这似乎也很难实施。

与您的计算引擎关联的服务帐户将解决问题。

Service accounts authenticate applications running on your virtual machine instances to other Google Cloud Platform services. For example, if you write an application that reads and writes files on Google Cloud Storage, it must first authenticate to the Google Cloud Storage API. You can create a service account and grant the service account access to the Cloud Storage API.

由于历史原因,所有项目都带有 Compute Engine 默认服务帐户,可使用此电子邮件进行识别:

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com

默认情况下,计算引擎的服务帐户对google云存储服务具有只读访问权限。因此,计算引擎可以使用 GCP 客户端库访问您的存储。

gsutil 是 GCP 存储的命令行工具,对于试用存储提供的各种选项非常方便。

首先从您的计算引擎中输入 gsutil ls,它会列出您云存储中的所有存储桶。

听起来您正在寻找 Signed URLs

@jterrace的回答就是你想要的

签名 URL 可以有与之关联的时间限制。在您的应用程序中,您将为该文件创建一个已签名的 url 并执行到该文件的 HTTP 重定向。

https://cloud.google.com/storage/docs/access-control/create-signed-urls-program

如果您使用的是默认计算引擎服务帐户(与您的 GCE 实例关联的默认帐户),您应该能够正常签名。只需按照上面 url 中有关如何创建密钥的说明进行操作即可。

您可以通过这种方式做各种很棒的事情,包括允许用户直接上传到 google 云存储! :)