Rails7 Active Storage生产环境(Heroku+S3)图片上传失败排查
排查Heroku + S3 + Active Storage图片上传500错误
1. 修正S3 CORS配置
Active Storage直接上传需要特定的CORS规则,确保你的S3桶CORS配置如下(替换为实际的Heroku应用域名):
<CORSConfiguration> <CORSRule> <AllowedOrigin>https://your-heroku-app.herokuapp.com</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>PUT</AllowedMethod> <AllowedHeader>*</AllowedHeader> <ExposeHeader>ETag</ExposeHeader> <ExposeHeader>Content-Length</ExposeHeader> </CORSRule> </CORSConfiguration> > 注意:CORS配置保存后需要5-10分钟才会生效,不要立即测试。 ## 2. 核对Heroku环境变量 确认Heroku配置中已正确设置所有AWS参数,执行`heroku config`命令检查: - `AWS_ACCESS_KEY_ID`:AWS访问密钥ID - `AWS_SECRET_ACCESS_KEY`:AWS秘密访问密钥 - `AWS_REGION`:S3桶所在区域(如`us-west-2`) - `S3_BUCKET_NAME`:目标S3桶名称 若有缺失或错误,用`heroku config:set KEY=VALUE`命令补充或修正。 ## 3. 查看服务器日志定位具体错误 执行`heroku logs --tail`命令,触发一次图片上传操作后,查看日志中500错误的详细栈信息: - 若出现`Aws::S3::Errors::PermissionDenied`:给对应的IAM用户添加以下权限政策(替换为你的桶名): ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListBucket"], "Resource": ["arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*"] } ] }
- 若出现
Vips::Error:确认项目根目录的Aptfile配置正确,内容应为:
libvips42 libvips-dev
重新部署Heroku应用后,在控制台验证vips可用性:
heroku run rails console > require 'vips' # 无报错即表示安装成功
4. 确认Active Storage配置与迁移状态
- 检查
config/environments/production.rb中是否包含:
config.active_storage.service = :amazon
- 检查
config/storage.yml的:amazon配置是否正确引用环境变量:
amazon: service: S3 access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %> secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> region: <%= ENV['AWS_REGION'] %> bucket: <%= ENV['S3_BUCKET_NAME'] %>
- 执行
heroku run rails db:migrate,确保active_storage_blobs和active_storage_attachments表已在生产环境创建。
5. 检查S3桶附加权限
若S3桶启用了服务器端加密(KMS),需确保IAM用户拥有kms:GenerateDataKey和kms:Decrypt权限;同时确认桶的访问控制列表(ACL)未设置过度限制,允许IAM用户进行对象操作。
内容的提问来源于stack exchange,提问作者Jack Gio Packham
相关产品推荐
相关产品推荐

