【发布时间】: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'
到目前为止我所知道的
-
rake db:seeds在本地运行没有问题 - 这些都设置正确:
ENV['AWS_ACCESS_KEY_ID']
ENV['AWS_SECRET_ACCESS_KEY']
ENV['AWS_REGION']
ENV['S3_BUCKET']
- 存储桶的 IAM 具有以下策略:
- 允许的操作:
All S3 actions (s3:*) - 存储桶名称的资源 ARN
- 存储桶具有以下 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 访问权限限制为一种资源(即一个存储桶),就会导致进程从工作变为不工作。这是存储桶设置:
和accesspoint、job、object和storagelensconfig都保持不变。
【问题讨论】:
-
是否有可能只是没有通过与种子文件相关的凭据?由种子文件启动时,其他上传是否有效?
-
@RockwellRice 请参阅更新部分。基本上,如果我放宽 IAM 上的策略,它会起作用,而当我明智地设置它(即,将其限制为仅读取、写入和列出 my_bucket 上的权限)时,它就不起作用了。很奇怪。但我认为因为它适用于 S3FullAccess 意味着它不是信用问题。 IE。它必须是 IAM 策略设置的问题。
-
@RockwellRice 但要专门回答您的问题,是的,当我完全打开 IAM 策略时一切正常(种子中的所有上传工作),但是当 IAM 策略设置合理时没有任何作用 - 它错误在第一个
user.image.attach(....)
标签: ruby-on-rails ruby amazon-web-services amazon-s3 heroku