Ruby 中 nil:NilClass 的 Aws::S3::Presigner 未定义方法凭证

2023-12-27

我使用了 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'

如果有人知道如何获取预签名网址,请告诉我们

Thanks


无用的错误消息表明您尚未配置 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, bucket: @bucket, key: key, 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

当我展示如何在代码中配置凭据时,我strongly建议反对这一点。您应该在启动应用程序之前将凭据导出到 ENV 或将它们放入共享凭据文件中。

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

或者将以下内容放入 ~/.aws/credentials

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 中 nil:NilClass 的 Aws::S3::Presigner 未定义方法凭证 的相关文章

随机推荐