我正在尝试配置ActiveStorage使用S3存储桶作为存储后端但是我不想传递任何access_key_id
,secret_access_key
,region
。相反,我想使用以前定义的IAM角色。这种配置提到here。它读(我加粗):
如果要使用环境变量,标准SDK配置文件,配置文件,IAM实例配置文件或任务角色,则可以省略上述示例中的access_key_id,secret_access_key和区域键。 Amazon S3服务支持AWS SDK文档中描述的所有身份验证选项。
但是我无法让它发挥作用。我的storage.yml
看起来与此类似:
amazon:
service: S3
bucket: bucket_name
credentials:
role_arn: "linked::account::arn"
role_session_name: "session-name"
我运行rails active_storage:install
,应用生成的迁移并在我的应用程序配置中设置config.active_storage.service = :amazon
。
问题是,当我尝试保存文件时,我收到一个意外错误:
u = User.first
s = StringIO.new
s << 'hello,world'
s.seek 0
u.csv.attach(io: s, filename: 'filename.csv')
Traceback (most recent call last):
2: from (irb):3
1: from (irb):3:in `rescue in irb_binding'
LoadError (Unable to autoload constant ActiveStorage::Blob::Analyzable, expected /usr/local/bundle/gems/activestorage-5.2.2/app/models/active_storage/blob/analyzable.rb to define it)
我正在使用Rails 5.2.2。
您是在AWS EC2实例中还是在本地机器中尝试此代码?
如果您在AWS中检查身份验证方法:https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html#aws-ruby-sdk-credentials-iam
您将看到以下部分:
使用IAM设置凭据
对于Amazon Elastic Compute Cloud实例,请创建AWS Identity and Access Management角色,然后为您的Amazon EC2实例授予对该角色的访问权限。有关更多信息,请参阅适用于Linux实例的Amazon EC2用户指南中的Amazon EC2的IAM角色或适用于Windows实例的Amazon EC2用户指南中的Amazon EC2的IAM角色。
这意味着要使此身份验证方法起作用,您必须:
将角色附加到实例后,config / storage.yml文件将如下所示:
amazon:
service: S3
bucket: test-stackoverflow-bucket-app
region: "us-west-1"
请注意,region是必需参数,如果跳过它会出错:https://github.com/aws/aws-sdk-ruby/issues/1240#issuecomment-231866239
我担心这不会在本地工作,在本地使用active_storage
你必须设置access_key_id
,secret_access_key
值。