Rails7部署Heroku使用Amazon S3报AWS凭证缺失错误求助
Rails 7 部署 Heroku 报 Aws::Sigv4 凭证缺失错误修复
问题描述
基于 Ruby 3.1.1 搭建 Rails 7 应用,采用 Amazon S3 服务存储图片资源,应用内已添加 AWS 相关凭证。应用部署至 Heroku 平台后完成数据库迁移操作,且在 Heroku 后台配置了全部所需环境变量,访问 Heroku 分配的应用链接时抛出如下错误:
missing credentials, provide credentials with one of the following options: (Aws::Sigv4::Errors::MissingCredentialsError)
- :access_key_id and :secret_access_key
- :credentials
- :credentials_provider
已配置RAILS_MASTER_KEY环境变量,错误仍未解决。
现有配置
storage.yml
test: service: Disk root: <%= Rails.root.join("tmp/storage") %> local: service: Disk root: <%= Rails.root.join("storage") %> amazon: service: S3 access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> region: <%= Rails.application.credentials.dig(:aws, :region) %> bucket: <%= Rails.application.credentials.dig(:aws, :bucket) %>
环境配置(development.rb / production.rb)
config.active_storage.service = :amazon
本地加密凭证(通过 EDITOR="code --wait" rails credentials:edit 写入)
aws: access_key_id: ****** secret_access_key: ******* region: ******* bucket: *******
修复方案
这是 Rails 7 搭配 Heroku 部署 Active Storage S3 模块的常见问题,按以下顺序排查即可解决:
- 首先检查加密凭证文件是否被Git忽略
打开项目根目录的.gitignore文件,查看是否存在config/credentials.yml.enc的忽略规则。如果有,直接删除该条规则,将credentials.yml.enc文件提交到部署分支后重新推送部署。很多开发者误将加密凭证文件加入忽略列表,导致Heroku部署时拿不到加密后的凭证内容,即使配置了正确的RAILS_MASTER_KEY也无法解密出AWS配置。 - 校验
RAILS_MASTER_KEY匹配性
打开本地项目config/master.key文件,复制其中的内容,和Heroku后台配置的RAILS_MASTER_KEY值逐位对比,确认没有多余空格、换行,也没有混用其他环境的key。校验时可以在本地终端执行heroku run rails runner "puts Rails.application.credentials.dig(:aws, :access_key_id)",如果返回结果为nil,说明master key和加密凭证文件不匹配,替换为正确的key即可。 - 检查生产环境是否存在覆盖配置
打开config/environments/production.rb,搜索是否存在手动配置config.active_storage.service_configurations、AWS客户端初始化参数的代码,这类硬编码如果留空会覆盖storage.yml的读取逻辑,找到后直接删除即可。 - 备选方案:直接读取Heroku环境变量
如果不想依赖Rails加密凭证机制,可以直接修改storage.yml中的amazon配置段,改为直接读取Heroku环境变量,跳过凭证解密逻辑:
修改后在Heroku后台配置上述四个对应的环境变量,重新部署即可,该方式排查链路更短,不容易出现配置不生效的问题。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['AWS_BUCKET'] %>
内容的提问来源于stack exchange,提问作者ejoka
相关产品推荐
相关产品推荐

