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

glu*_*glu 6 ruby-on-rails amazon-s3 ruby-on-rails-5 rails-activestorage ruby-on-rails-5.2

我正在尝试将 ActiveStorage 配置为使用 S3 存储桶作为存储后端,但是我不想传递任何access_key_id, secret_access_key, region. 相反,我想使用之前定义的 IAM 角色。此处提到这种配置。它写着(我加了粗体):

如果您想使用环境变量、标准 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"
Run Code Online (Sandbox Code Playgroud)

我已经运行rails active_storage:install,应用了生成的迁移并config.active_storage.service = :amazon在我的应用程序配置中进行了设置。

问题是,当我尝试保存文件时,出现意外错误:

amazon:
  service: S3
  bucket: bucket_name
  credentials:
    role_arn: "linked::account::arn"
    role_session_name: "session-name"
Run Code Online (Sandbox Code Playgroud)

我正在使用 Rails 5.2.2。

Car*_*nez 6

您是在 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 用户指南(适用于 Linux 实例)中的 Amazon EC2 的 IAM 角色 或 Amazon EC2 用户指南(适用于 Windows 实例)中的 Amazon EC2 的 IAM 角色。

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

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

将角色附加到实例后,您的config/storage.yml文件将如下所示:

amazon:
  service: S3
  bucket: test-stackoverflow-bucket-app
  region: "us-west-1"
Run Code Online (Sandbox Code Playgroud)

请注意,区域是必需参数,如果跳过它,您将收到错误:https ://github.com/aws/aws-sdk-ruby/issues/1240#issuecomment-231866239

恐怕这在本地不起作用,要active_storage在本地使用,您必须设置access_key_id,secret_access_key值。