配置ActiveStorage以将S3与IAM角色一起使用

问题描述 投票:1回答:1

我正在尝试配置ActiveStorage使用S3存储桶作为存储后端但是我不想传递任何access_key_idsecret_access_keyregion。相反,我想使用以前定义的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。

ruby-on-rails amazon-s3 ruby-on-rails-5 rails-activestorage ruby-on-rails-5.2
1个回答
1
投票

您是在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角色。

这意味着要使此身份验证方法起作用,您必须:

  • 在AWS上创建EC2实例
  • 创建具有写入S3存储桶权限的EC2 IAM角色
  • 配置将新IAM角色附加到其上的EC2实例

将角色附加到实例后,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_idsecret_access_key值。

© www.soinside.com 2019 - 2024. All rights reserved.