【问题标题】:How to create a signed S3 url如何创建签名的 S3 url
【发布时间】:2016-05-25 15:50:33
【问题描述】:

我想使用data.table 包中的fread 从 S3 读取 csv 文件,如下所示:

 ulr_with_signature <- signURL(url, access_key, secret_key)
 DT <- fread(ulr_with_signature)

是否有某个包或一段代码允许我使用访问/秘密密钥对构建 URL。

我不想使用awscli 来读取数据。

【问题讨论】:

标签: r security amazon-s3


【解决方案1】:

您可以使用AWS S3 package:

执行您的阅读:

# These variables should be set in your environment, but you could set them in R:
Sys.setenv("AWS_ACCESS_KEY_ID" = "mykey",
       "AWS_SECRET_ACCESS_KEY" = "mysecretkey",
       "AWS_DEFAULT_REGION" = "us-east-1")

library("aws.s3")

如果您有一个 R 对象 obj 想要保存到 AWS,然后再阅读:

s3save(obj, bucket = "my_bucket", object = "object")
# and then later
obj <- s3load("object", bucket = "my_bucket")

显然将存储桶名称和文件名(AWS 存储桶中对象的名称)替换为实际值。该软件包还具有相应的s3save 函数。您还可以使用s3saveRDSs3readRDS 以RDS 格式保存和加载。

如果你需要读取一个文本文件,那就有点复杂了,因为库的函数 'get_object' 返回一个原始向量,我们必须自己解析它:

raw_data <- get_object('data.csv', 'my_bucket')

# this method to parse the data is copied from the httr library
# substitute encoding from as needed
data <- iconv(readBin(raw_data, character()), from="UTF-8", to="UTF-8")

# now the data can be read by any R function, eg.
read.csv(data)
fread(data)

# All this can be done without temporary objects:
fread(iconv(
  readBin(get_object('data.csv', 'my_bucket'), character()),
  from="UTF-8", to="UTF-8"))

据我所知,您对“签名 URL”的概念不可用。如果您尝试开发这样的解决方案,请注意:重要的是要考虑将秘密访问密钥存储在源代码中的安全隐患。

关于“签名 url”的另一个问题是对象将存储在内存中。如果工作空间被保存,它将存储在磁盘上。这样的解决方案必须仔细审查安全性。

【讨论】:

  • 很抱歉 - 太早了。您担心这会创建一个临时文件吗?啊哈。据我从代码中可以看出,这实际上并没有创建一个临时文件,但我可能弄错了。 s3load 调用get_object(这里没有文件创建),get_object 调用s3HTTP,仍然没有本地文件,并且该函数调用来自httr 包的GET 方法。我在任何地方都看不到awscli
  • 为了澄清我最初的帖子:“文件名”不是本地文件名。它是云端文件的文件名,即。 S3 文件名。
  • 好的,我想我们快到了。我想这样做 fread(url) 我可以使用 aws.signature 包中的 signature_v2_authsignature_v4_auth 吗? - cran.r-project.org/web/packages/aws.signature/aws.signature.pdf
  • 不,很抱歉,这行不通。无法通过身份验证将 URL 存储到 AWS 文件 。身份验证通过将签名(由 signature_v4_auth 方法创建)作为 header 与 GET 请求一起发送来工作。所以请求看起来像这样(不完全是——但重点很清楚):GET /bucket/filename; Authentication: AUTH TOKEN HERE。您的想法的问题是 URL 与身份验证令牌是分开的,它不能存储为单个对象。 (对不起格式)
  • 这是因为 get_object 返回一个原始向量,而不是字符向量或连接。你可以这样做,诚然有点令人费解:fread(iconv(readBin(get_object(url, bucket), character()), from = "UTF-8", to = "UTF-8"))(用适当的编码替换 from="UTF-8")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2014-09-04
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2022-07-08
  • 2021-10-13
相关资源
最近更新 更多