You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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环境变量,跳过凭证解密逻辑:
    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'] %>
    
    修改后在Heroku后台配置上述四个对应的环境变量,重新部署即可,该方式排查链路更短,不容易出现配置不生效的问题。

内容的提问来源于stack exchange,提问作者ejoka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:01:08