Amazon web services CloudFront源站访问身份签名url上传的文件可以';不能由boto3或IAM角色访问?

Amazon web services CloudFront源站访问身份签名url上传的文件可以';不能由boto3或IAM角色访问?,amazon-web-services,amazon-s3,amazon-cloudfront,boto3,Amazon Web Services,Amazon S3,Amazon Cloudfront,Boto3,我接着是私有文件的cloudfront文档 bucket策略如下所示: { "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::clou

我接着是私有文件的cloudfront文档

bucket策略如下所示:

{  
"Version": "2008-10-17",  
"Id": "PolicyForCloudFrontPrivateContent",  
"Statement": [  
    {  
        "Sid": "1",  
        "Effect": "Allow",  
        "Principal": {  
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXX"  
        },  
        "Action": "s3:*",  
        "Resource": "arn:aws:s3:::XXXXXX/*"  
    }  
]  
}
当我上传文件时,通过带有密钥对的签名url。文件所有者是

Owner CloudFront Origin Access Identity *********
 ****MyCountName***** 
目前,我无法在ec2中使用boto3。命令

aws s3 cp s3::/xxx/uploadfile test.txt 
给我一个错误:

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
我可以上传不使用签名url的文件。这些文件可以由boto3访问。这些文件的所有者是

Owner CloudFront Origin Access Identity *********
 ****MyCountName***** 

因此,我不明白为什么
ec2
机器不能引导
源访问标识
文件?

您是在尝试将文件上载到S3还是从S3下载文件?因为您提到了这个命令aws s3 cp s3::/xxx/uploadfile test.txt,它下载一个文件而不是上传,这是一个aws cli命令而不是boto3


请查看此处的文档-

正如您所注意到的,当CloudFront原始访问标识(OAI)授权上载时,OAI是拥有对象的实体,而不是您的帐户

Owner CloudFront Origin Access Identity XXXX
OAI代表您独家控制的实体,但实际上它们不是您AWS帐户的一部分

Owner CloudFront Origin Access Identity XXXX
对象的所有权由授权上载的帐户决定,而不是由拥有bucket的帐户决定。除上载帐户之外的帐户必须由拥有该对象的帐户授予权限

x-amz-acl: bucket-owner-full-control

您可以使用bucket策略将此标头设为必填项

如果您控制进行上载的客户端,则应该能够添加此标头

如果您无法控制客户端,则应该能够使用Lambda@Edge查看器请求触发器。我尚未测试此代码,但它应该可以达到以下目的:

'use strict';

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

另外,如果您查看IAM策略,它只向CloudFront OAI用户授予GetObject权限。尝试一下,它就会工作。谢谢我应该更仔细地阅读这份文件。我认为有一个问题。
原始访问标识
是上载对象的所有者。当您不想从s3中删除对象,但想通过
cloudfront禁用访问时,似乎没有办法。因为所有者始终可以读取对象。@jiamo您可以通过将对象复制到自身来更改对象的所有者。发出copy命令的帐户成为所有者,这将允许bucket所有者从OAI中夺走所有权。
k=s3c.head\u object(bucket='test',Key='test')m=k[“Metadata”]s3c.copy\u object(bucket='test',Key='test',CopySource={bucket='test Key='test},Metadata=m,MetadataDirective='REPLACE'))
似乎没有更改所有者。@这是意外的。它是否更改了上次修改的时间戳?如果成功的话,应该是这样。