ruby-on-rails – Aws :: S3 :: Presigner未定义的nil方法凭证:Ruby中的NilClass

我使用aws-sdk-core gem我在获取url表单aws时遇到错误
以下是我的代码
def initialize(bucket:,region:)
    @bucket = bucket
    client = Aws::S3::Client.new(region: region)
    @signer = Aws::S3::Presigner.new(client: client)
  end

  def sign(key,expires_in: 3600)
    @signer.presigned_url(:get_object,bucket: @bucket,key: key,expires_in: expires_in)
  end

我收到了错误

NoMethodError - undefined method `credentials' for nil:NilClass:
  aws-sdk-core (2.1.15) lib/aws-sdk-core/signers/v4.rb:24:in `initialize'
  aws-sdk-core (2.1.15) lib/aws-sdk-core/s3/presigner.rb:88:in `block in sign_but_dont_send'

如果有人知道如何获得预先签名的网址,请让我们知道

谢谢

解决方法

无用的错误消息表明您尚未配置AWS凭据.这些都需要生成签名.如果您使用客户端发送请求,您将收到一条更有用的错误消息,指出需要凭据.
def initialize(bucket:,region:)
  @bucket = bucket
  creds = Aws::Credentials.new('ACCESS_KEY','SECRET_ACCESS_KEY')
  client = Aws::S3::Client.new(region: region,credentials,creds)
  @signer = Aws::S3::Presigner.new(client: client)
end

def sign(key,expires_in: 3600)
  @signer.presigned_url(:get_object,expires_in: expires_in)
end

与您的问题无关,但您可以使用S3的资源接口来清理代码.

def initialize(bucket:,region:)
  @bucket = Aws::S3::Bucket.new(bucket,{
    region: region,credentials: Aws::Credentials.new('ACCESS_KEY','SECRET_ACCESS_KEY'),})
end

def sign(key,expires_in: 3600)
  @bucket.object(key).presigned_url(:get,expires_in: expires_in)
end

虽然我展示了如何在代码中配置凭据,但我强烈建议不要这样做.您应该在启动应用程序之前将凭据导出到ENV,或将它们放在共享凭证文件中.

$export AWS_ACCESS_KEY_ID=...
$export AWS_SECRET_ACCESS_KEY=...

或者将以下内容放在〜/ .aws / credentials中

[default]
aws_access_key_id=...
aws_secret_access_key=...

如果使用ENV或共享凭证文件,则不再需要在代码中配置它们.当SDK未提供给客户端构造函数时,SDK将尝试获取这些位置.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...