Ruby:使用 AWS 实例配置文件进行 S3 访问

Mik*_*ike 9 ruby aws-sdk-ruby

我有一个附加了配置文件的 ec2 实例。我可以使用 awscli,它可以很好地上传到存储桶。

root@ocr-sa-test:/# aws s3 ls s3://company-ocr-east/
                           PRE 7_day_expiry/

root@ocr-sa-test:/# touch foo
root@ocr-sa-test:/# aws s3 cp foo s3://company-ocr-east/foo
upload: ./foo to s3://company-ocr-east/foo
root@ocr-sa-test:/# aws s3 rm s3://company-ocr-east/foo
delete: s3://company-ocr-east/foo
Run Code Online (Sandbox Code Playgroud)

不过,我无法让它与 ruby​​ 中的 aws-sdk 一起使用。我被拒绝访问。

irb(main):001:0> require "aws-sdk"
=> true
irb(main):002:0>
irb(main):003:0> credentials = Aws::InstanceProfileCredentials.new
irb(main):004:1* client = Aws::S3::Client.new(
irb(main):005:1*   region: "us-east-1",
irb(main):006:1*   credentials: credentials,
irb(main):007:0> )
irb(main):008:0>
irb(main):009:0>
irb(main):010:0>
irb(main):011:1* begin
irb(main):012:2*   client.put_object(
irb(main):013:2*     key: 'hello.txt',
irb(main):014:2*     body: 'Hello World!',
irb(main):015:2*     bucket: 'company-ocr-east',
irb(main):016:2*     content_type: 'text/plain'
irb(main):017:1*   )
irb(main):018:1* rescue Exception => e
irb(main):019:1*   puts "S3 Upload Error: #{e.class} : Message: #{e.message}"
irb(main):020:0> end
S3 Upload Error: Aws::S3::Errors::AccessDenied : Message: Access Denied
Run Code Online (Sandbox Code Playgroud)

Sco*_*zey -1

访问被拒绝错误可能是由Aws::InstanceProfileCredentials.

尝试使用更长的超时或额外的重试来初始化它:

credentials = Aws::InstanceProfileCredentials.new({
retries: 2,                 # Integer, default: 1
http_open_timeout: 2.5,     # Float, default: 1
http_read_timeout: 2.5      # Float, default: 1
}) 
Run Code Online (Sandbox Code Playgroud)

该文档没有明确说明超时选项是以秒还是其他持续时间给出的。2.5考虑到默认值,似乎很保守。可能需要进一步调整。


v3 Ruby API 的 AWS 文档在Aws::S3::Client 文档中讨论了激进的超时,您可以看到配置Aws::InstanceProfileCredentials 的选项。