小编bar*_*gan的帖子

无法使用boto和django在S3中设置文件权限

我一直试图找到一个解决方案大约36个小时,所以希望我不是重复问题或问一些明显的问题.我正在构建一个Web应用程序,它必须操作我存储在S3中的文件,并使用"public-read"acl将新版本放回S3中.然后,可以使用其他页面查看更新的文件.该应用程序存在于亚马逊EC2服务器上,并连接到亚马逊S3桶.

我正在使用django,celery和boto来做这件事.我有一个celery任务设置,从我的一个视图中获取一些信息并进行处理,然后将新文件发布到S3.我能够从S3获取原始文件,成功操作它,并将其重新发布到S3.唯一似乎不起作用的是更改该文件的权限.所以一切正常,除非你去查看页面,我在尝试访问该文件时收到403(Forbidden)错误.

如果我自己进入S3并更改该文件的权限以供所有人阅读,那么一切正常.在我继续之前,我在我的任务中使用的代码几乎可以工作:

name = 'filename.blah'
conn = boto.connect_s3()
b = conn.get_bucket(settings.AWS_STORAGE_BUCKET_NAME)
grab_from_S3(name,b) # grab file from S3
out_name = conv(name)
send_to_S3(out_name,b)
Run Code Online (Sandbox Code Playgroud)

那里的功能是:

def grab_from_S3(file,bucket):
    k = Key(bucket)
    k.key = file
    k.get_contents_to_filename(file)

def send_to_S3(file,bucket):
    k = Key(bucket)
    k.key = file
    k.set_contents_from_filename(file)
    k.set_acl('public-read')
Run Code Online (Sandbox Code Playgroud)

和conv(名称)只做一些转换的东西.因此,除了文件的权限不是"公共读取"之外,这几乎一直有效.我假设的所有AWS凭据和存储桶名称都是从环境中正确导入的,因为它能够从S3推送文件和从中提取文件.

令人困惑的是,当我从EC2服务器上的venv打开一个python环境,或者只是安装在它上面的python开始时,我运行上面显示的所有命令,它都可以工作.我可以毫无问题地更改权限.当任务运行时,它不会在芹菜日志中抛出任何错误,所以我不认为任务实际上遇到了错误.它只是没有改变它应该改变的东西.

我尝试过的事情:

  1. 我试图使用权限功能的其他版本,如k.set_contents_from_filename(file,policy='public-read')k.make_public()b.set_acl('public-read',out_name)但这些都不工作无论是.
  2. 我更改了存储桶的权限,说每个人都被允许更改权限,但它仍无法正常工作.
  3. 我试图将存储桶策略更改为以下内容,但它没有任何效果:

    { "Version": "2008-10-17", "Id": "whatever", "Statement": [ { "Sid": "whatever", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "s3:PutObjectAcl", "s3:PutObject"], "Resource": [ "arn:aws:s3:::bucket_name", "arn:aws:s3:::bucket_name/*" ] …

django file-permissions amazon-s3 boto celery

5
推荐指数
1
解决办法
3296
查看次数

标签 统计

amazon-s3 ×1

boto ×1

celery ×1

django ×1

file-permissions ×1