无法通过S3访问通过CloudFront更新的文件

时间:2015-01-16 10:15:12

标签: amazon-web-services amazon-s3 amazon-cloudfront

我使用Cloud-Front访问S3存储桶中的文件并更新文件。我现在禁用Cloud-Front,但是我现在无法直接通过S3访问这些文件。

此外,当我尝试为存储桶中的项目设置权限时,我会收到一条消息,指出访问被拒绝。对于直接通过S3更新的项目,我没有这样的问题。

如何直接通过s3启用对我的存储桶中文件的访问?

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题:使用Origin Access Identity创建的文件无法被主机帐户(或任何用户帐户)读取,也无法通过CLI,Lambda或Console访问。

解决方案

我的解决方案是在客户端请求上设置一个标头,允许桶所有者控制文件。

yes = ["yes", "y"] m = "men" w = "women" badkeywordslist = ["depression", "pain", "hurt", "dead", "die", "kill", "hell", "suffering", "cutting", "cut", "death"] Question1 = input("We will start off simple, what is your name?") if len(Question1) > 0 and Question1.isalpha(): Question2 = input("Ah! Lovely name, %s. Not surprised you get all the women, or is it men?" % Question1) if Question2.lower() in m: print ("So, your name is %s and you enjoy the pleasure of %s! I bet you didnt see that coming." % (Question1, Question2)) elif Question2.lower() in w: print ("So, your name is %s and you enjoy the pleasure of %s! I bet you didnt see that coming." % (Question1, Question2)) else: print ("Come on! You're helpless. I asked you a simple question with 2 very destinctive answers. Restart!") else: print ("Come on, enter your accurate information before proceeding! Restart me!") Question3 = input("Now I know your name and what gender attracts you. One more question and I will know everything about you... Shall we continue?") if Question3.lower() in yes: Question4 = input("Well, it's quite simple really. What's good in your life and what's bad?") if Question4 in badkeywordslist: print ("Oh... So your life isn't going so great now, is it? For starters, are you safe?")

这不应要求更改您的Cloudfront分发版。所有x-amz-acl=bucket-owner-full-control标题都应自动传递。

我使用需要此标头的存储桶策略补充了此解决方案。因此,人们无法破解我的客户端并上传我无法管理的文件。以下内容添加到允许x-amz-*原始访问标识的策略语句对象中:

s3:PutObject

说明

原因在Managing Access with ACLs中描述。

  

例如,如果存储桶拥有者允许上载其他AWS账户   对象,只能使用object来管理这些对象的权限   拥有该对象的AWS账户的ACL。

我发现管理由Origin Access Identity创建的ACL的唯一方法是在对象创建时设置"Condition": { "StringEquals": { "s3:x-amz-acl": [ "bucket-owner-full-control" ] } } 标头。

答案 1 :(得分:1)

Waylon Flinn's answer的替代方法是在Lambda @ Edge函数中添加/覆盖x-amz-acl标头。在nodejs中遵循以下原则:

exports.handler = (event, context, callback) => {
    const { request } = event.Records[0].cf;
    const { headers } = request;
    headers['x-amz-acl'] = [{key: 'x-amz-acl', value: 'bucket-owner-full-control'}];    
    callback(null, request);
};

优点是您不再需要Waylon在其答案中写的策略,因为您总是在自己可信任的环境中自行设置x-amz-acl头。缺点是Lambda @ Edge具有自身的复杂性,怪癖和额外成本。由您决定哪种方法更适合您的用例。

当Waylon在2016年写下答案时,Lambda @ Edge根本不可用。它于2017年7月17日(将近一年后):Lambda@Edge now Generally Available普遍可用。

答案 2 :(得分:-1)

曾经有过几次问题。解决方案是创建CloudFront Origin Access Identity并在创建CF时将其添加到您的分发。

分发 - >流媒体 - >分发设置 - >编辑 限制存储桶访问:是 源访问标识:使用现有(您可能需要设置) 授予读取权限:是的 限制查看者访问(使用签名URL):是 值得信赖的签名者:自我 ...用于休息的默认值...

我希望有帮助