AWS 和 Rails:授权头格式错误;凭证格式错误

The*_* Oz 5 ruby ruby-on-rails amazon-s3 amazon-web-services

我正在尝试从生产服务器访问我的 S3 存储桶。在开发中一切正常,但是在我的 prod 控制台中我得到:

Aws::S3::Errors::AuthorizationHeaderMalformed: The authorization header is malformed; the Credential is mal-formed; expecting "<YOUR-AKID>/YYYYMMDD/REGION/SERVICE/aws4_request".
Run Code Online (Sandbox Code Playgroud)

我的代码:

class AwsFileDownloader
  def initialize(args)
    @s3 = Aws::S3::Client.new
    @aws_file_path = ...
  end

  def get_file
    temp_file = File.new('temp.csv', 'r+')
    @s3.get_object({bucket: Rails.application.secrets.aws_bucket, key: @aws_file_path}, target: temp_file)
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

我的 aws 初始化程序(在两种环境中似乎都可以正常工作):

require 'aws-sdk'

Aws.config.update({
  region: Rails.application.secrets.aws_region,
  credentials: Aws::Credentials.new(Rails.application.secrets.access_key_id, Rails.application.secrets.secret_access_key)
})
Run Code Online (Sandbox Code Playgroud)

感谢任何建议!

Ale*_*exa 28

这个答案很晚了,但也许有人会发现它很有用。上面的错误是当你切换AWS KEY IDAWS ACCESS KEY.

在正确的位置使用正确的凭据,它应该可以解决您的问题。

  • 十分感谢!我使用密钥作为登录和秘密。 (2认同)

gwc*_*des 5

需要检查的事项:

  • 存储桶 ACL 和存储桶策略。生产与开发匹配吗?
  • 您的任何键是否包含斜杠,可能会被错误解析?
  • 您的开发区域和生产区域不同吗?如果您尝试不同的地区会有什么不同吗?