【发布时间】:2021-02-23 13:23:14
【问题描述】:
我有一个附有配置文件的 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
我无法让它与 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
【问题讨论】:
-
它是通过 ec2 实例配置文件,并且由于尝试在 kubernetes 中运行它并且不希望容器中的 api 密钥,因此不能使用本地 .aws creds 文件
-
如果我运行
credentials = Aws::InstanceProfileCredentials.new并打印出凭证对象,我会看到带有过期时间的临时密钥/秘密 -
嗨,迈克,您是否尝试在创建客户端之前配置凭据?
Aws.config.update( credentials: credentials )在做之前:client = Aws::S3::Client.new( region: "us-east-1" )似乎他们建议在 AWS 文档中这样做:docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/… 和 docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/… -
@Mike,您的代码适用于我配置类似的 EC2 实例。 AWS 库可以在运行时自动生成凭证,而无需显式传递它。您可以尝试在构建客户端后从第 11 行运行您的代码,例如:
client = Aws::S3::Client.new(region: "us-east-1") -
@Mike 你能解决这个问题吗?解决方案是什么?
标签: ruby aws-sdk-ruby