mirror of https://github.com/ceph/ceph
198 lines
4.8 KiB
ReStructuredText
198 lines
4.8 KiB
ReStructuredText
.. _python:
|
|
|
|
Python S3 Examples
|
|
==================
|
|
|
|
Creating a Connection
|
|
---------------------
|
|
|
|
This creates a connection so that you can interact with the server.
|
|
|
|
.. code-block:: python
|
|
|
|
import boto
|
|
import boto.s3.connection
|
|
access_key = 'put your access key here!'
|
|
secret_key = 'put your secret key here!'
|
|
|
|
conn = boto.connect_s3(
|
|
aws_access_key_id = access_key,
|
|
aws_secret_access_key = secret_key,
|
|
host = 'objects.dreamhost.com',
|
|
#is_secure=False, # uncomment if you are not using ssl
|
|
calling_format = boto.s3.connection.OrdinaryCallingFormat(),
|
|
)
|
|
|
|
|
|
Listing Owned Buckets
|
|
---------------------
|
|
|
|
This gets a list of Buckets that you own.
|
|
This also prints out the bucket name and creation date of each bucket.
|
|
|
|
.. code-block:: python
|
|
|
|
for bucket in conn.get_all_buckets():
|
|
print("{name}\t{created}".format(
|
|
name = bucket.name,
|
|
created = bucket.creation_date,
|
|
))
|
|
|
|
The output will look something like this::
|
|
|
|
mahbuckat1 2011-04-21T18:05:39.000Z
|
|
mahbuckat2 2011-04-21T18:05:48.000Z
|
|
mahbuckat3 2011-04-21T18:07:18.000Z
|
|
|
|
|
|
Creating a Bucket
|
|
-----------------
|
|
|
|
This creates a new bucket called ``my-new-bucket``
|
|
|
|
.. code-block:: python
|
|
|
|
bucket = conn.create_bucket('my-new-bucket')
|
|
|
|
|
|
Listing a Bucket's Content
|
|
--------------------------
|
|
|
|
This gets a list of objects in the bucket.
|
|
This also prints out each object's name, the file size, and last
|
|
modified date.
|
|
|
|
.. code-block:: python
|
|
|
|
for key in bucket.list():
|
|
print("{name}\t{size}\t{modified}".format(
|
|
name = key.name,
|
|
size = key.size,
|
|
modified = key.last_modified,
|
|
))
|
|
|
|
The output will look something like this::
|
|
|
|
myphoto1.jpg 251262 2011-08-08T21:35:48.000Z
|
|
myphoto2.jpg 262518 2011-08-08T21:38:01.000Z
|
|
|
|
|
|
Deleting a Bucket
|
|
-----------------
|
|
|
|
.. note::
|
|
|
|
The Bucket must be empty! Otherwise it won't work!
|
|
|
|
.. code-block:: python
|
|
|
|
conn.delete_bucket(bucket.name)
|
|
|
|
|
|
Forced Delete for Non-empty Buckets
|
|
-----------------------------------
|
|
|
|
.. attention::
|
|
|
|
not available in python
|
|
|
|
|
|
Creating an Object
|
|
------------------
|
|
|
|
This creates a file ``hello.txt`` with the string ``"Hello World!"``
|
|
|
|
.. code-block:: python
|
|
|
|
key = bucket.new_key('hello.txt')
|
|
key.set_contents_from_string('Hello World!')
|
|
|
|
|
|
Uploading an Object or a File
|
|
-----------------------------
|
|
|
|
This creates a file ``logo.png`` with the contents from the file ``"logo.png"``
|
|
|
|
.. code-block:: python
|
|
|
|
key = bucket.new_key('logo.png')
|
|
key.set_contents_from_filename('logo.png')
|
|
|
|
|
|
Change an Object's ACL
|
|
----------------------
|
|
|
|
This makes the object ``hello.txt`` to be publicly readable, and
|
|
``secret_plans.txt`` to be private.
|
|
|
|
.. code-block:: python
|
|
|
|
hello_key = bucket.get_key('hello.txt')
|
|
hello_key.set_canned_acl('public-read')
|
|
plans_key = bucket.get_key('secret_plans.txt')
|
|
plans_key.set_canned_acl('private')
|
|
|
|
|
|
Download an Object (to a file)
|
|
------------------------------
|
|
|
|
This downloads the object ``perl_poetry.pdf`` and saves it in
|
|
``/home/larry/documents/``
|
|
|
|
.. code-block:: python
|
|
|
|
key = bucket.get_key('perl_poetry.pdf')
|
|
key.get_contents_to_filename('/home/larry/documents/perl_poetry.pdf')
|
|
|
|
|
|
Delete an Object
|
|
----------------
|
|
|
|
This deletes the object ``goodbye.txt``
|
|
|
|
.. code-block:: python
|
|
|
|
bucket.delete_key('goodbye.txt')
|
|
|
|
|
|
Generate Object Download URLs (signed and unsigned)
|
|
---------------------------------------------------
|
|
|
|
This generates an unsigned download URL for ``hello.txt``. This works
|
|
because we made ``hello.txt`` public by setting the ACL above.
|
|
This then generates a signed download URL for ``secret_plans.txt`` that
|
|
will work for 1 hour. Signed download URLs will work for the time
|
|
period even if the object is private (when the time period is up, the
|
|
URL will stop working).
|
|
|
|
.. code-block:: python
|
|
|
|
hello_key = bucket.get_key('hello.txt')
|
|
hello_url = hello_key.generate_url(0, query_auth=False, force_http=True)
|
|
print(hello_url)
|
|
|
|
plans_key = bucket.get_key('secret_plans.txt')
|
|
plans_url = plans_key.generate_url(3600, query_auth=True, force_http=True)
|
|
print(plans_url)
|
|
|
|
The output of this will look something like::
|
|
|
|
http://objects.dreamhost.com/my-bucket-name/hello.txt
|
|
http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
|
|
|
|
Using S3 API Extensions
|
|
-----------------------
|
|
|
|
To use the boto3 client to tests the RadosGW extensions to the S3 API, the `extensions file`_ should be placed under: ``~/.aws/models/s3/2006-03-01/`` directory.
|
|
For example, unordered list of objects could be fetched using:
|
|
|
|
.. code-block:: python
|
|
|
|
print(conn.list_objects(Bucket='my-new-bucket', AllowUnordered=True))
|
|
|
|
|
|
Without the extensions file, in the above example, boto3 would complain that the ``AllowUnordered`` argument is invalid.
|
|
|
|
|
|
.. _extensions file: https://github.com/ceph/ceph/blob/main/examples/rgw/boto3/service-2.sdk-extras.json
|