Aws::S3::Errors::InvalidAccessKeyId您提供的 AWS 访问密钥 ID 在我们的记录中不存在

问题描述

在 Rails 6 应用程序中,我将 aws-sdk-s3 与 ActiveStorage 结合使用,我想上传图像。

步骤:

这是我的配置

# Gemfile
gem 'aws-sdk-s3','~> 1',require: false

# storage.yml
amazon:
  service: S3
  access_key_id: ENV['AWS_ACCESS_KEY_ID']
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
  region: eu-west-1
  bucket: mybucketname

# config/aws.rb
require 'aws-sdk-core'

Aws.config.update(
  region:      'eu-west-1',credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'],ENV['AWS_SECRET_ACCESS_KEY'])
)

我有一个简单的模型:

has_one_attached :picture,dependent: :destroy

在开发中一切正常,但在生产中不正常。

例如……

> model_object.picture.attach(io: File.open(Rails.root.join('testfile.png')),filename: 'testfile.png')
> Aws::S3::Errors::InvalidAccessKeyId (The AWS Access Key Id you provided does not exist in our records.)

环境变量从控制台正确可见,所以我不认为这是一个配置问题...

ENV['AWS_ACCESS_KEY_ID']
ENV['AWS_SECRET_ACCESS_KEY']

我能做什么?


为了确保我拥有正确的 AWS 访问策略,我使用 API 直接从控制台上传一个图像,如下所示:

require 'aws-sdk-core'

Aws.config.update(
  region: 'eu-west-1',credentials: Aws::Credentials.new(myakid,mysecret_key)
)

s3 = Aws::S3::Client.new
resp = s3.list_buckets
resp.buckets.map(&:name) # He gave me the list of my buckets

resp = s3.list_objects(bucket: 'MYBUCKET',max_keys: 2)
resp.contents.each do |object|
  puts "#{object.key} => #{object.etag}"
end

# upload
resource = Aws::S3::Resource.new
object = resource.bucket(MYBUCKET).object("completed.png")
object.upload_file(Rails.root.join('app/assets/images/completed.png'))

并且文件已正确上传

所以,我不明白为什么 ActiveStorage 不起作用...

解决方法

我发现,不知何故,Aws.config 返回了一个空对象。 我不得不重新启动服务器,现在..

Aws.config
=> {:region=>"eu-west-1",:credentials=>#<Aws::Credentials access_key_id="XYZ">}

图片正在上传中!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...