我正在使用CarrierWaveDirect将高分辨率图像上传到s3。然后,我使用该图像来处理通过Cloudfront URL公开的多个版本。
上传的高分辨率文件需要对匿名用户保持私有,但web应用程序需要访问私有文件才能对其他版本进行处理。
我目前正在通过在CarrierWave初始化器中将所有上传的文件设置为私有
config.fog_public=错误
我有一个允许完全管理员访问的web应用程序IAM策略。我还在应用程序中为IAM用户设置了ACCESSKEY和SECRETKEY。考虑到这两个标准,我认为web应用程序可以访问私人文件并继续处理,但它被拒绝访问私人文件。
*当我登录到与web应用程序关联的用户帐户时,我能够访问私人文件,因为URL上添加了一个令牌。
我不明白为什么应用程序无法访问ACCESSKEY和SECRRETKEY 的私人文件
我很难解决你的问题。我很确定你的问题不是
即使IAM策略授予访问的权限,也无法访问专用s3文件
而是
如何手工制作一个预签名的URL,用于在S3 上获取私人文件
要点显示您正在尝试为GET自己创建预签名的URL。虽然这非常好,但它也非常容易出错
请使用AWS SDK for Ruby(我在这里只发布了已知可用于版本1的代码,但如果您不受遗留代码的限制,请从版本2开始)来验证您所尝试的是否有效:
s3 = AWS::S3.new
bucket = s3.buckets["your-bucket-name"]
obj = bucket.objects["your-object-path"]
obj.url_for(:read, expires: 10*60) # generate a URL that expires in 10 minutes
有关详细信息,请参见AWS::S3::S3Object#url_for
和Aws::S3::Object#presigned_url
的文档。
您可能需要在此处阅读向AWS::S3.new
传递args的相关信息(对于凭据、区域等)。
我建议你采取以下步骤:
- 使用
access_key_id
和secret_access_key
使其在本地工作 - 让它在你的员工身上发挥作用
- 如果它有效,您可以将SDK返回的查询字符串与您自己手工制作的查询字符串进行比较。也许你能发现一个错误
但无论如何,我建议您使用更高级别的SDK来为您做类似的事情
如果这还不能让你有所收获,请发表评论并附上你的新发现。