AWS::S3::Errors::InvalidAccessKeyId 凭据有效

AWS::S3::Errors::InvalidAccessKeyId with valid credentials

我在尝试将文件上传到 S3 存储桶时遇到以下错误:

AWS::S3::Errors::InvalidAccessKeyId: The AWS Access Key Id you provided does not exist in our records.

文件存在,存储桶存在,存储桶允许上传,凭据正确,并且使用具有相同凭据的 Cyber​​Duck 我可以连接并将文件上传到该存储桶。这里的大多数答案都指向凭据被环境变量覆盖,这里不是这种情况,我尝试将它们直接作为字符串传递,并输出它们只是为了确保它是正确的凭据。

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')

这是使用 gem (aws-sdk-v1) 的 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 上 Rails 4 应用程序的抽佣任务。

终于弄明白了,问题是因为我们使用的是自定义端点,所以找不到凭据,我想这与自定义端点的工作方式不同。

现在要指定自定义端点,出于某种原因,您需要使用一个配置选项 is not documented (or at least I didn't find it anywhere), I actually had to go through paperclip's code 看看那些人是如何处理这个的。

无论如何,v1 的配置与添加的端点配置是这样的:

AWS.config(
  :access_key_id => 'key',
  :secret_access_key => 'secret',
  :s3_endpoint => 'custom.endpoint.com'
)

希望这会节省一些时间。