我正在尝试配置 ActiveStorage 以使用 S3 存储桶作为存储后端,但我不想传递任何access_key_id
, secret_access_key
, region
。相反,我想使用之前定义的 IAM 角色。提到了这样的配置here https://guides.rubyonrails.org/active_storage_overview.html#amazon-s3-service。内容如下(我已添加粗体):
如果你想使用环境变量、标准SDK配置文件、配置文件、IAM 实例配置文件或任务角色,您可以省略上例中的 access_key_id、secret_access_key 和区域键。 Amazon S3 服务支持 AWS 开发工具包文档中描述的所有身份验证选项。
但是我无法让它工作。我的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 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 实例对该角色的访问权限。了解更多
有关信息,请参阅 Amazon EC2 用户指南中的 Amazon EC2 的 IAM 角色
对于 Amazon EC2 用户中的 Linux 实例或 Amazon EC2 的 IAM 角色
Windows 实例指南。
这意味着要使此身份验证方法发挥作用,您必须:
- 在AWS上创建EC2实例
- 创建EC2IAM Role具有写入 S3 存储桶的权限
- 配置您的 EC2 实例,将新的 IAM 角色附加到其上
将角色附加到实例后,您的配置/存储.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 https://github.com/aws/aws-sdk-ruby/issues/1240#issuecomment-231866239
恐怕这在本地不起作用,要使用active_storage
您必须在本地设置access_key_id
, secret_access_key
values.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)