[尝试将文件上传到S3存储桶时出现以下错误:
AWS::S3::Errors::InvalidAccessKeyId: The AWS Access Key Id you provided does not exist in our records.
文件存在,存储桶存在,存储桶允许上传,凭据正确,使用具有相同凭据的CyberDuck,我可以连接文件并将其上传到该存储桶就好了。此处的大多数答案都指向凭据,但环境变量会覆盖它们,但实际情况并非如此,我尝试将它们直接作为字符串传递,并输出它们以确保它是正确的凭据。
v1
AWS.config(
:access_key_id => 'key',
:secret_access_key => 'secret'
)
s3 = AWS::S3.new
bucket = AWS::S3.new.buckets['bucket-name']
obj = bucket.objects['filename']
obj.write(file: 'path-to-file', acl:'private')
这使用的是宝石的v1
版本(aws-sdk-v1
,但我也尝试过使用v3
,但出现相同的错误。
v3
Aws.config.update({
region: 'eu-west-1',
credentials: Aws::Credentials.new('key_id', 'secret')
})
s3 = Aws::S3::Resource.new(region: 'eu-west-1')
bucket = s3.bucket('bucket-name')
obj = bucket.object('filename')
ok = obj.upload_file('path-to-file')
注意:错误在obj.write
行上引发。
注2:这是Ruby on Rails 4应用程序中的rake任务。
最后弄清楚了,问题在于,因为我们使用的是自定义端点,所以找不到凭据,我想这与自定义端点的工作原理不同。
现在要指定自定义终结点,您将需要使用出于某些原因is not documented(或至少我在任何地方都找不到它)的配置选项,实际上我必须经过paperclip's code来了解如何家伙正在处理这个。
无论如何,v1的配置与为端点添加的配置是什么样子:
AWS.config(
:access_key_id => 'key',
:secret_access_key => 'secret',
:s3_endpoint => 'custom.endpoint.com'
)
希望这可以节省一些时间。