ceph radosgw - политика корзины - сделать все объекты открытыми для чтения по умолчанию

Я работаю с группой не-разработчиков, которые загружают объекты в корзину стиля s3 через radosgw. Все загруженные объекты должны быть общедоступными, но они не могут делать это программно. Есть ли способ сделать разрешение по умолчанию для публичного чтения объекта, чтобы его не нужно было каждый раз устанавливать вручную? Должен быть способ сделать это с помощью boto, но я пока не нашел примеров. Есть несколько пользователей, использующих графический интерфейс AWS, но это не вариант для меня.:(

Я создаю ведро, как это:

#!/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')

Но мои конечные пользователи не способны сделать это, поэтому мне нужен способ сделать это разрешением по умолчанию для загруженного файла.

1 ответ

Решение

Я нашел решение своей проблемы.

Во-первых, большое спасибо Джошану, который опубликовал это: 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)

Теперь, когда объект загружен в public-bucket, он может быть анонимно загружен без явной установки разрешения ключа для публичного чтения или генерации URL-адреса для загрузки.

Если вы делаете это, ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО убедитесь, что ЛЮБОЙ можно скачать этот материал. Особенно, если ваша служба radosgw общедоступна в Интернете.

Другие вопросы по тегам