【问题标题】:Obtain temporary access to folder inside Google Storage bucket获取对 Google Storage 存储桶内文件夹的临时访问权限
【发布时间】:2019-12-03 21:44:29
【问题描述】:

我正在寻找如何提供对 Google Cloud Storage 中“文件夹”的临时访问权限的方法。

我的问题: 我有很多“文件夹”的存储桶(我知道 GCS 上不存在该文件夹)。

\Bucket
|-Folder1
 \-File2.csv
 |-File3.csv
 |-File4.csv
|-Folder2
 \-File5.csv
 |-File6.csv

我想给用户一个临时访问权限(自动过期的东西)来读取 Bucket/Folder1/*,这样用户就可以访问整个目录“Folder1”并下载该目录中的所有文件(File2.csv,文件 3.csv、文件 4.csv)。

我找到了 signedUrls https://cloud.google.com/storage/docs/gsutil/commands/signurl,但我没有找到如何为整个 Folder1 目录提供访问权限的方法。

我能够使用以下策略在 AWS S3 上运行相同的场景:

{
  "Effect": "Allow",
  "Action": "s3:ListBucket",
  "Resource": [
    "arn:aws:s3:::name-of-a-bucket"
  ],
  "Condition": {
    "StringLike": {
      "s3:prefix": "Folder1/*"
    }
  }
}

有什么方法可以为多个文件提供临时访问权限?

【问题讨论】:

  • 使用 GCS API 怎么样?我相信我们可以使用 API 更改文件夹上的 ACL。然后我们可以编写一个授予访问权限的作业,并安排在一段时间后执行第二个作业来删除访问权限?
  • @Kolban 我必须每秒提供数百个这样的凭据。我不确定 ACL 是否是为这样的场景设计的。在cloud.google.com/storage/quotas 里面我找到了句子There is a limit of 100 access control list entries (ACLs) per object。我将不得不创建某种缓存机制,因为在每个到期期间(在我的情况下为 12 小时)可以访问文件超过 100 次。在“最坏的情况下”我必须这样做......但我希望谷歌云内部有一些东西已经解决了这个问题:-)

标签: amazon-s3 google-cloud-storage


【解决方案1】:

您可以通过using the * wildcard 指定存储桶中的许多对象。在指定您要定位的子目录时使用它将识别它下的所有对象。例如,如果您尝试访问 Bucket 中 Folder1 中的对象,您可以使用:

gs://Bucket/Folder1/*

然后您将访问 File2.csv、File3.csv 和 File4.csv。

要通过使用签名 URL 授予对存储桶对象的临时访问权限,您可以使用带有以下后缀的对象可用性的 -d flag to specify the duration: - s 秒 - m 分钟 - h 几个小时 - d 几天

记住这些细节: - 不指定 -d 标志会将持续时间设置为 1 小时。 - 不指定后缀以小时为单位设置持续时间。 - 最长持续时间为 7 天。

以下将创建 2 小时的签名 URL:

gsutil signurl -d 2 <private-key-file> gs://some-bucket/some-object/

使用 -d 2h 会做同样的事情。

以下将创建 15 分钟的签名 URL:

gsutil signurl -d 15m <private-key-file> gs://some-bucket/some-object/

最后,要授予对 Folder1 中所有对象的下载权限,请使用以下可用对象 1 小时:

gsutil signurl <private-key-file> gs://Bucket/Folder1/*

添加 -d 1 或 -d 1h 会做同样的事情。

私钥文件是一个 JSON 或 P12 格式的文件,在您 create your key 时创建。您应该选择您喜欢的位置来存储它,然后在运行命令以创建签名 URL 时替换为它的路径。

【讨论】:

  • 感谢您的回答!我已经尝试过你建议我的方法。它实际上做的是遍历文件夹并为每个文件创建签名的 url。我有包含大约 5000 个小文件的目录。因此,如果用户通过 API 为这些文件创建请求,他将获得大约 10000 行 JSON。在 AWS S3 中,只有 5 行带有凭证。提供 1files=1signUrl 的唯一方法是如何实现我的场景?谢谢。
  • 由于子目录只是存储桶中文件夹的假象,实际上是包含“/”的对象名称,因此子目录中的每个文件都有自己的签名 URL。无法为特定子目录创建单个签名 URL 并允许其文件暂时可用。
【解决方案2】:

使用签名的url,我得到它的方式是列出所有文件,然后生成url

例如:

const options = {
    prefix: 'foldeName',
};

const optionsBucket = {
    version: 'v2',
    action: 'read',
    expires: Date.now() + 1000 * 60 * 9, // 9 minutes
};

const [files] = await storage.bucket('your-bucket-name').getFiles(options);

for (let nota of files) {
    let fileName = nota.name;

    const [url] = await storage
        .bucket(bucketName)
        .file(fileName)
        .getSignedUrl(optionsBucket);

... continue your code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-21
    • 2020-12-03
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2020-11-17
    • 2022-12-09
    • 2019-10-12
    相关资源
    最近更新 更多