【问题标题】:Ceph radosgw - bucket policy - make all objects public-read by defaultCeph radosgw - 存储桶策略 - 默认使所有对象公开读取
【发布时间】:2019-11-05 12:10:07
【问题描述】:

我与一组非开发人员一起工作,他们通过 radosgw 将对象上传到 s3 样式存储桶。所有上传的对象都需要公开可用,但它们不能以编程方式执行此操作。有没有办法让对象的默认权限为公共读取,这样就不必每次都手动设置? boto 必须有办法做到这一点,但我还没有找到任何例子。有一些使用 AWS 的 GUI 浮动,但这不是我的选择。 :(

我正在创建一个这样的存储桶:

#!/usr/bin/env python

import boto
import boto.s3.connection

access_key = "SAMPLE3N84XBEHSAMPLE"
secret_key = "SAMPLEc4F3kfvVqHjMAnsALY8BCQFwTkI3SAMPLE"

conn = boto.connect_s3(
        aws_access_key_id = access_key,
        aws_secret_access_key = secret_key,
        host = '10.1.1.10',
        is_secure=False,
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )

bucket = conn.create_bucket('public-bucket', policy='public-read')

我将策略设置为公共读取,这似乎允许人们将存储桶作为目录浏览,但存储桶中的对象不继承此权限。

>>> print bucket.get_acl()
<Policy: http://acs.amazonaws.com/groups/global/AllUsers = READ, S3 Newbie (owner) = FULL_CONTROL>

为了澄清,我知道我可以像这样基于每个对象解决这个问题:

key = bucket.new_key('thefile.tgz')
key.set_contents_from_filename('/home/s3newbie/thefile.tgz')
key.set_canned_acl('public-read')

但我的最终用户无法执行此操作,因此我需要一种方法将其设为上传文件的默认权限。

【问题讨论】:

    标签: python amazon-s3 boto ceph radosgw


    【解决方案1】:

    我找到了解决问题的方法。

    首先,非常感谢发布此内容的 joshbean:https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/python/example_code/s3/s3-python-example-put-bucket-policy.py

    我注意到他正在使用 boto3 库,所以我开始使用它进行连接。

    import boto3
    import json
    
    access_key = "SAMPLE3N84XBEHSAMPLE"
    secret_key = "SAMPLEc4F3kfvVqHjMAnsALY8BCQFwTkI3SAMPLE"
    
    conn = boto3.client('s3', 'us-east-1',
                        endpoint_url="http://mycephinstance.net",
                        aws_access_key_id = access_key,
                        aws_secret_access_key = secret_key)
    
    bucket = "public-bucket"
    
    bucket_policy = {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Sid":"AddPerm",
          "Effect":"Allow",
          "Principal": "*",
          "Action":["s3:GetObject"],
          "Resource":["arn:aws:s3:::{0}/*".format(bucket)]
        }
      ]
    }
    
    bucket_policy = json.dumps(bucket_policy)
    conn.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy)
    

    现在当一个对象上传到公共存储桶时,它可以匿名下载,而无需显式设置公共读取的密钥权限或生成下载 URL。

    如果您这样做,请务必确定任何人都可以下载这些内容。特别是如果您的 radosgw 服务可以在 Internet 上公开访问。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2016-11-19
    • 2019-01-23
    相关资源
    最近更新 更多