【问题标题】:Can't find reason for Aws::S3::Errors::InvalidAccessKeyId when uploading to S3上传到 S3 时找不到 Aws::S3::Errors::InvalidAccessKeyId 的原因
【发布时间】:2015-12-19 17:50:44
【问题描述】:

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

  1. 我有一个运行 lighttpd 的 EC2 实例,该实例代理到在 Thin 上运行的 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

任何帮助将不胜感激!

【问题讨论】:

    标签: ruby amazon-web-services amazon-s3 amazon-ec2 sinatra


    【解决方案1】:

    剖析问题:

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

    示例文件:

    [default]
    aws_access_key_id = YOUR_ACCESS_KEY
    aws_secret_access_key = YOUR_SECRET_KEY
    

    【讨论】:

    • 啊...按照您的建议,我直接传递了我的凭据,我发现了我的问题!当初始化文件值需要裸露时,我将它们用单引号括起来。
    • 感谢您为我指明了正确的方向!现在我将按照您的建议研究 ec2 角色:)
    • 伙计们,我对密钥 invalidaccesskeyID 有疑问。只是为了确定我所做的事情:在创建新用户时从 AWS 下载 CSV 文件。 复制粘贴访问密钥和秘密密钥为:aws_access_key_id = 'YOUR_ACCESS_KEY' 直接在 python 中。它从来没有奏效!我做错了什么?
    【解决方案2】:

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-26
      • 2020-06-17
      • 1970-01-01
      • 2012-04-25
      • 2017-04-14
      • 2020-02-24
      • 2022-06-14
      • 1970-01-01
      相关资源
      最近更新 更多