在 Rails 6 应用程序上,我将 aws-sdk-s3 与 ActiveStorage 一起使用,并且我想上传图像。
脚步:
- 我使用 S3FullAccess 在 AWS 上创建了一个 IAM 用户
- 我配置了 storage.yml (见下文)
- 我使用以下内容创建了一个 config/aws.rb 文件
这是我的配置
# 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 不起作用......