【问题标题】:ActiveStorage can't move file to S3 - Aws::S3::Errors::AccessDenied: Access DeniedActiveStorage 无法将文件移动到 S3 - Aws::S3::Errors::AccessDenied: Access Denied
【发布时间】:2021-03-30 21:07:50
【问题描述】:

(简单)问题

我正在尝试一个简单的heroku run rake db:seeds。它尝试使用 Active Storage 将少量图像从 app/assets/images 移动到 AWS S3。

这是失败的部分:

user = User.last
file_name = "steve.png"
file_path = Rails.root.join("app", "assets", "images", "seeds")
user.user_primary_image.attach(io: File.open(file_path + file_name), filename: file_name)
Aws::S3::Errors::AccessDenied: Access Denied
from /app/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.104.3/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'

到目前为止我所知道的

  1. rake db:seeds 在本地运行没有问题
  2. 这些都设置正确:
ENV['AWS_ACCESS_KEY_ID']
ENV['AWS_SECRET_ACCESS_KEY']
ENV['AWS_REGION']
ENV['S3_BUCKET'] 
  1. 存储桶的 IAM 具有以下策略:
  • 允许的操作:All S3 actions (s3:*)
  • 存储桶名称的资源 ARN
  1. 存储桶具有以下 CORS: (example 替换为实际域)
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "https://www.example.com"
        ],
        "ExposeHeaders": []
    },
    {
        "AllowedHeaders": [],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

到此为止,我想不出还有什么可以尝试调试的……

更新

我创建了一个具有 S3 完全访问权限(每个存储桶的每个权限)的新 IAM,并且它可以正常工作。所以问题在于更精细的 IAM,当然必须实施(让它完全开放是不明智的)。

所以我采用了工作实现,然后添加了写入、列出和读取权限,并缩小到一个存储桶(它需要的那个),现在我重现了错误:

Aws::S3::Errors::AccessDenied: Access Denied
from /app/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.104.3/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'

所以我知道错误与权限或资源有关。我说不出是什么。可能是 S3 中的错误?

更新 2

在拥有所有权限的情况下,只需将 S3 访问权限限制为一种资源(即一个存储桶),就会导致进程从工作变为不工作。这是存储桶设置:

accesspointjobobjectstoragelensconfig都保持不变。

【问题讨论】:

  • 是否有可能只是没有通过与种子文件相关的凭据?由种子文件启动时,其他上传是否有效?
  • @RockwellRice 请参阅更新部分。基本上,如果我放宽 IAM 上的策略,它会起作用,而当我明智地设置它(即,将其限制为仅读取、写入和列出 my_bucket 上的权限)时,它就不起作用了。很奇怪。但我认为因为它适用于 S3FullAccess 意味着它不是信用问题。 IE。它必须是 IAM 策略设置的问题。
  • @RockwellRice 但要专门回答您的问题,是的,当我完全打开 IAM 策略时一切正常(种子中的所有上传工作),但是当 IAM 策略设置合理时没有任何作用 - 它错误在第一个user.image.attach(....)

标签: ruby-on-rails ruby amazon-web-services amazon-s3 heroku


【解决方案1】:

因此,经过数小时的切换和测试,试图缩小导致其工作和不工作的特定设置的范围,我终于得出了这个策略足以与 Active Storage 一起使用,并且它仅限于一个存储桶(即不仅可以访问 S3 中的所有内容):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::mybucket"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::mybucket/*"]
    }
  ]
}

只需在这两个地方将mybucket 替换为您的存储桶名称即可。

我找到了here

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 2019-06-10
    • 1970-01-01
    • 2021-05-09
    • 2019-09-25
    • 2020-02-24
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多