【问题标题】:Configuring ActiveStorage to use S3 with IAM role将 ActiveStorage 配置为将 S3 与 IAM 角色一起使用
【发布时间】:2019-08-06 20:28:09
【问题描述】:

我正在尝试将 ActiveStorage 配置为使用 S3 存储桶作为存储后端,但是我不想传递 access_key_idsecret_access_keyregion 中的任何一个。相反,我想使用之前定义的 IAM 角色。提到了这种配置here。上面写着(我加了粗体):

如果您想使用环境变量、标准 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。

【问题讨论】:

    标签: ruby-on-rails amazon-s3 ruby-on-rails-5 rails-activestorage ruby-on-rails-5.2


    【解决方案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 实例对该角色的访问权限。更多 有关信息,请参阅 Amazon EC2 用户指南中的 Amazon EC2 的 IAM 角色 用于 Amazon EC2 用户中的 Linux 实例或 IAM 角色 Windows 实例指南。

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

    • 在 AWS 上创建 EC2 实例
    • 创建具有写入 S3 存储桶权限的 EC2 IAM 角色
    • 配置您的 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_idsecret_access_key 值。

    【讨论】:

    • 虽然我的 ec2 实例具有完整的 S3 访问权限,但出现访问被拒绝错误。是否必须设置 AWS STS Access Token
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2016-07-10
    • 2019-05-10
    • 2018-12-24
    相关资源
    最近更新 更多