我使用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
i am error
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'
如果有人知道如何获得预先指定的url,请告诉我们
谢谢
无用的错误消息表明您没有配置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
虽然我展示了如何在代码中配置凭据,但我强烈建议不要这样做。您应该在启动应用程序之前将凭据导出到ENV,或者将它们放在共享凭据文件中。
$ export AWS_ACCESS_KEY_ID=...
$ export AWS_SECRET_ACCESS_KEY=...
或者将以下内容放入~/.aws/credentials
[default]
aws_access_key_id=...
aws_secret_access_key=...
如果您使用ENV或共享凭证文件,那么您不再需要在代码中配置它们。当这些位置没有提供给客户端构造函数时,SDK将尝试获取这些位置。