上传到 S3 时找不到 Aws::S3::Errors::InvalidAccessKeyId 的原因

Can't find reason for Aws::S3::Errors::InvalidAccessKeyId when uploading to S3

我搜索了 Stack Overflow 和互联网,但没有找到答案:

  1. 我有一个 EC2 实例 运行 lighttpd 代理到瘦的 Ruby Sinatra 应用程序 运行。
  2. 我在 S3 上有一个存储桶,我正尝试通过 Sinatra 应用程序上传到该存储桶,文件在我的本地计算机上,我正在使用 EC2 上的 Sinatra 应用程序 运行 将文件传输到我的 S3 存储桶。
  3. 我按照 Amazon 的指示在 .aws/credentials 文件中设置了我的凭据。

每次我尝试上传文件时,无论是通过 Sinatra 应用还是尝试通过 REPL 测试从 EC2 实例上传的本地文件,我都会收到以下错误消息:

Aws::S3::Errors::InvalidAccessKeyId The AWS Access Key Id you provided does not exist in our records.

我设置了一个 CORS 配置:

<CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>PUT</AllowedMethod>
    </CORSRule>
</CORSConfiguration>

这是我的 Ruby 代码:

helpers do

  def upload(filename, file, credentials)
    bucket = 'BUCKET_NAME'
    region = 'us-west-2'

    s3 = Aws::S3::Resource.new(region: region, credentials: credentials)
    obj = s3.bucket(bucket).object(filename)
    obj.upload_file(file)
  end

end

get '/' do
  erb :index
end

get '/upload' do
  erb :upload
end

post '/upload' do
  file = params[:file][:tempfile]
  filename = params[:file][:filename]
  credentials = Aws::SharedCredentials.new
  upload(filename, file, credentials)
  redirect '/success'
end

如有任何帮助,我们将不胜感激!

剖析问题:

  • 为了上传的目的,CORS无所谓。您正在与 S3 通话并直接上传
  • 凭据文件需要位于 ~/.aws/credentials 中,其中 ~ 是当前用户的主页。 sinatra 运行 属于哪个用户?存在 .aws/credentials 的同一用户?
  • 凭据文件的格式是否正确?它需要采用 ini 样式,并且对于您所描述的内容,它需要具有访问密钥和秘密密钥(请参见下面的示例)
  • 如果您从文件中取出凭据并直接使用凭据进行调用,是否有效? (只是因为你可能在这里混淆了错误)
  • 您是否考虑过使用 ec2 角色将凭据推送到盒子,让 EC2 和 AWS SDK 为您完成这项工作(即您无需担心每台机器/等的凭据轮换/权限)

示例文件:

[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY

很明显,您删除了访问密钥 ID 或者您使用了错误的访问密钥 ID,只需转到您的用户设置或要求您的管理员为您提供正确的访问密钥 ID 和访问密钥,并在您的帐户中附加适当的策略这样您就可以上传到 S3。

希望对您有所帮助