如何使用Ruby将文件内容从S3存储桶下载到内存中

Bec*_*cks 2 ruby amazon-s3 bucket amazon-web-services aws-sdk

我在 Amazon AWS S3 中有一个存储桶,其中有一个名为users.csv.

如何使用 Ruby 将该文件的内容从 S3 存储桶加载到内存中以便解析它?

这是我的代码:

require 'aws-sdk'
s3 = Aws::S3::Resource.new(region: 'us-west-1')
resp = s3.list_objects(bucket: 'bucket-name', max_keys: 1)
resp.contents.each do |object|
    puts #{object.value}
end
Run Code Online (Sandbox Code Playgroud)

当我在 IRB 中尝试这个时,我得到:

struct Aws::S3::Types::Object key="users.csv", last_modified=2017-11-15 19:10:28 UTC, etag="\"9a3d50c07aa4aa6976037ce774294a26\"", size=101, storage_class="STANDARD", owner=struct Aws::S3::Types::Owner display_name="owner-name", id="42093cfa4ccb23a8156cdab8500a41a10bdbf90deebb0ee8a3b340dd1e0c3622"
Run Code Online (Sandbox Code Playgroud)

如何解析 的内容users.csv

Exp*_*ple 7

从 AWS 文档:

将对象下载到内存中

对于小对象,获取一个对象并使其在您的 Ruby 进程中可用会很有用。如果您没有:target为下载指定 a ,则整个对象将被加载到内存中,成为一个 StringIO 对象。

def import_from_s3 

  #initiate the client
  s3 = Aws::S3::Client.new({
      region:            region,
      access_key_id:     key_id,
      secret_access_key: secret
  })

  #Get the object
  resp = s3.get_object(bucket: bucket, key: key)

 resp.body
 #=> #<StringIO ...> 

 resp.body.read
 #=> '...'
Run Code Online (Sandbox Code Playgroud)

在 StringIO 上调用#read#string以获取作为 String 对象的正文。

有关更多信息,请参阅“使用适用于 Ruby 的 AWS 开发工具包从 Amazon S3 下载对象”。