上传到 S3 时找不到 Aws::S3::Errors::InvalidAccessKeyId 的原因
Can't find reason for Aws::S3::Errors::InvalidAccessKeyId when uploading to S3
我搜索了 Stack Overflow 和互联网,但没有找到答案:
- 我有一个 EC2 实例 运行 lighttpd 代理到瘦的 Ruby Sinatra 应用程序 运行。
- 我在 S3 上有一个存储桶,我正尝试通过 Sinatra 应用程序上传到该存储桶,文件在我的本地计算机上,我正在使用 EC2 上的 Sinatra 应用程序 运行 将文件传输到我的 S3 存储桶。
- 我按照 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。
希望对您有所帮助
我搜索了 Stack Overflow 和互联网,但没有找到答案:
- 我有一个 EC2 实例 运行 lighttpd 代理到瘦的 Ruby Sinatra 应用程序 运行。
- 我在 S3 上有一个存储桶,我正尝试通过 Sinatra 应用程序上传到该存储桶,文件在我的本地计算机上,我正在使用 EC2 上的 Sinatra 应用程序 运行 将文件传输到我的 S3 存储桶。
- 我按照 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。
希望对您有所帮助