| |
| |
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| |
| <meta name="description" content="Apache Ozone Documentation"> |
| |
| <title>Documentation for Apache Ozone</title> |
| |
| |
| <link href="../css/bootstrap.min.css" rel="stylesheet"> |
| |
| |
| <link href="../css/ozonedoc.css" rel="stylesheet"> |
| |
| </head> |
| |
| |
| <body> |
| |
| |
| <nav class="navbar navbar-inverse navbar-fixed-top"> |
| <div class="container-fluid"> |
| <div class="navbar-header"> |
| <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#sidebar" aria-expanded="false" aria-controls="navbar"> |
| <span class="sr-only">Toggle navigation</span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| </button> |
| <a href="../index.html" class="navbar-left ozone-logo"> |
| <img src="../ozone-logo-small.png"/> |
| </a> |
| <a class="navbar-brand hidden-xs" href="../index.html"> |
| Apache Ozone/HDDS documentation |
| </a> |
| <a class="navbar-brand visible-xs-inline" href="#">Apache Ozone</a> |
| </div> |
| <div id="navbar" class="navbar-collapse collapse"> |
| <ul class="nav navbar-nav navbar-right"> |
| <li><a href="https://github.com/apache/hadoop-ozone">Source</a></li> |
| <li><a href="https://hadoop.apache.org">Apache Hadoop</a></li> |
| <li><a href="https://apache.org">ASF</a></li> |
| </ul> |
| </div> |
| </div> |
| </nav> |
| |
| |
| <div class="wrapper"> |
| <div class="container-fluid"> |
| <div class="row"> |
| |
| <div class="col-sm-2 col-md-2 sidebar" id="sidebar"> |
| <ul class="nav nav-sidebar"> |
| |
| |
| |
| <li class=""> |
| |
| <a href="../index.html"> |
| |
| |
| |
| <span>Overview</span> |
| </a> |
| </li> |
| |
| |
| |
| <li class=""> |
| |
| <a href="../start.html"> |
| |
| |
| |
| <span>Getting Started</span> |
| </a> |
| </li> |
| |
| |
| |
| <li class=""> |
| <a href="../concept.html"> |
| |
| <span>Architecture</span> |
| </a> |
| <ul class="nav"> |
| |
| <li class=""> |
| |
| <a href="../concept/overview.html">Overview</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../concept/ozonemanager.html">Ozone Manager</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../concept/storagecontainermanager.html">Storage Container Manager</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../concept/containers.html">Containers</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../concept/datanodes.html">Datanodes</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../concept/recon.html">Recon</a> |
| |
| </li> |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class=""> |
| <a href="../feature.html"> |
| |
| <span>Features</span> |
| </a> |
| <ul class="nav"> |
| |
| <li class=""> |
| |
| <a href="../feature/ha.html">High Availability</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../feature/topology.html">Topology awareness</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../feature/quota.html">Quota in Ozone</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../feature/recon.html">Recon Server</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../feature/observability.html">Observability</a> |
| |
| </li> |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class=""> |
| <a href="../interface.html"> |
| |
| <span>Client Interfaces</span> |
| </a> |
| <ul class="nav"> |
| |
| <li class=""> |
| |
| <a href="../interface/ofs.html">Ofs (Hadoop compatible)</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../interface/o3fs.html">O3fs (Hadoop compatible)</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../interface/s3.html">S3 Protocol</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../interface/cli.html">Command Line Interface</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../interface/reconapi.html">Recon API</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../interface/javaapi.html">Java API</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../interface/csi.html">CSI Protocol</a> |
| |
| </li> |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class=""> |
| <a href="../security.html"> |
| |
| <span>Security</span> |
| </a> |
| <ul class="nav"> |
| |
| <li class=""> |
| |
| <a href="../security/secureozone.html">Securing Ozone</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../security/securingtde.html">Transparent Data Encryption</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../security/gdpr.html">GDPR in Ozone</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../security/securingdatanodes.html">Securing Datanodes</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../security/securingozonehttp.html">Securing HTTP</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../security/securings3.html">Securing S3</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../security/securityacls.html">Ozone ACLs</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../security/securitywithranger.html">Apache Ranger</a> |
| |
| </li> |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class=""> |
| |
| <a href="../tools.html"> |
| |
| |
| |
| <span>Tools</span> |
| </a> |
| </li> |
| |
| |
| |
| <li class=""> |
| |
| <a href="../recipe.html"> |
| |
| |
| |
| <span>Recipes</span> |
| </a> |
| </li> |
| |
| |
| <li><a href="../design.html"><span><b>Design docs</b></span></a></li> |
| <li class="visible-xs"><a href="#">References</a> |
| <ul class="nav"> |
| <li><a href="https://github.com/apache/hadoop"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> Source</a></li> |
| <li><a href="https://hadoop.apache.org"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> Apache Hadoop</a></li> |
| <li><a href="https://apache.org"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> ASF</a></li> |
| </ul></li> |
| </ul> |
| |
| </div> |
| |
| <div class="col-sm-10 col-sm-offset-2 col-md-10 col-md-offset-2 main"> |
| |
| |
| |
| <div class="col-md-9"> |
| <nav aria-label="breadcrumb"> |
| <ol class="breadcrumb"> |
| <li class="breadcrumb-item"><a href="../index.html">Home</a></li> |
| <li class="breadcrumb-item" aria-current="page"><a href="../recipe.html">Recipes</a></li> |
| <li class="breadcrumb-item active" aria-current="page">Access Ozone object store with Amazon Boto3 client</li> |
| </ol> |
| </nav> |
| |
| |
| |
| <div class="pull-right"> |
| |
| |
| |
| </div> |
| |
| |
| <div class="col-md-9"> |
| <h1>Access Ozone object store with Amazon Boto3 client</h1> |
| |
| <!--- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <p>This recipe shows how Ozone object store can be accessed from Boto3 client. Following apis were verified:</p> |
| <ul> |
| <li>Create bucket</li> |
| <li>List bucket</li> |
| <li>Head bucket</li> |
| <li>Delete bucket</li> |
| <li>Upload file</li> |
| <li>Download file</li> |
| <li>Delete objects(keys)</li> |
| <li>Head object</li> |
| <li>Multipart upload</li> |
| </ul> |
| <h2 id="requirements">Requirements</h2> |
| <p>You will need a higher version of Python3 for your Boto3 client as Boto3 installation requirement indicates at here: |
| <a href="https://boto3.amazonaws.com/v1/documentation/api/latest/index.html">https://boto3.amazonaws.com/v1/documentation/api/latest/index.html</a></p> |
| <h2 id="obtain-resource-to-ozone">Obtain resource to Ozone</h2> |
| <p>You may reference Amazon Boto3 documentation regarding the creation of ‘s3’ resources at here: |
| <a href="https://boto3.amazonaws.com/v1/documentation/api/latest/guide/resources.html">https://boto3.amazonaws.com/v1/documentation/api/latest/guide/resources.html</a></p> |
| <pre><code>s3 = boto3.resource('s3', |
| endpoint_url='http://localhost:9878', |
| aws_access_key_id='testuser/scm@EXAMPLE.COM', |
| aws_secret_access_key='c261b6ecabf7d37d5f9ded654b1c724adac9bd9f13e247a235e567e8296d2999' |
| ) |
| 'endpoint_url' is pointing to Ozone s3 endpoint. |
| </code></pre> |
| <h2 id="obtain-client-to-ozone-via-session">Obtain client to Ozone via session</h2> |
| <p>You may reference Amazon Boto3 documentation regarding session at here: |
| <a href="https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html">https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html</a></p> |
| <pre><code>Create a session |
| session = boto3.session.Session() |
| |
| Obtain s3 client to Ozone via session: |
| |
| s3_client = session.client( |
| service_name='s3', |
| aws_access_key_id='testuser/scm@EXAMPLE.COM', |
| aws_secret_access_key='c261b6ecabf7d37d5f9ded654b1c724adac9bd9f13e247a235e567e8296d2999', |
| endpoint_url='http://localhost:9878', |
| ) |
| 'endpoint_url' is pointing to Ozone s3 endpoint. |
| |
| In our code sample below, we're demonstrating the usage of both s3 and s3_client. |
| </code></pre> |
| <p>There are multiple ways to configure Boto3 client credentials if you’re connecting to a secured cluster. In these cases, |
| the above lines of passing ‘aws_access_key_id’ and ‘aws_secret_access_key’ when creating Ozone s3 client shall be skipped.</p> |
| <p>Please refer to Boto3 documentation for details at here: |
| <a href="https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html">https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html</a></p> |
| <h3 id="create-a-bucket">Create a bucket</h3> |
| <pre><code>response = s3_client.create_bucket(Bucket='bucket1') |
| print(response) |
| </code></pre> |
| <p>This will create a bucket ‘bucket1’ in Ozone volume ‘s3v’.</p> |
| <h3 id="list-buckets">List buckets</h3> |
| <pre><code>response = s3_client.list_buckets() |
| print('Existing buckets:') |
| for bucket in response['Buckets']: |
| print(f' {bucket["Name"]}') |
| </code></pre> |
| <p>This will list all buckets in Ozone volume ‘s3v’.</p> |
| <h3 id="head-a-bucket">Head a bucket</h3> |
| <pre><code>response = s3_client.head_bucket(Bucket='bucket1') |
| print(response) |
| </code></pre> |
| <p>This will head bucket ‘bucket1’ in Ozone volume ‘s3v’.</p> |
| <h3 id="delete-a-bucket">Delete a bucket</h3> |
| <pre><code>response = s3_client.delete_bucket(Bucket='bucket1') |
| print(response) |
| </code></pre> |
| <p>This will delete the bucket ‘bucket1’ from Ozone volume ‘s3v’.</p> |
| <h3 id="upload-a-file">Upload a file</h3> |
| <pre><code>response = s3.Bucket('bucket1').upload_file('./README.md','README.md') |
| print(response) |
| </code></pre> |
| <p>This will upload ‘README.md’ to Ozone creates a key ‘README.md’ in volume ‘s3v’.</p> |
| <h3 id="download-a-file">Download a file</h3> |
| <pre><code>response = s3.Bucket('bucket1').download_file('README.md', 'download.md') |
| print(response) |
| </code></pre> |
| <p>This will download ‘README.md’ from Ozone volume ‘s3v’ to local and create a file with name ‘download.md’.</p> |
| <h3 id="head-an-object">Head an object</h3> |
| <pre><code>response = s3_client.head_object(Bucket='bucket1', Key='README.md') |
| print(response) |
| </code></pre> |
| <p>This will head object ‘README.md’ from Ozone volume ‘s3v’ in the bucket ‘bucket1’.</p> |
| <h3 id="delete-objects">Delete Objects</h3> |
| <pre><code>response = s3_client.delete_objects( |
| Bucket='bucket1', |
| Delete={ |
| 'Objects': [ |
| { |
| 'Key': 'README4.md', |
| }, |
| { |
| 'Key': 'README3.md', |
| }, |
| ], |
| 'Quiet': False, |
| }, |
| ) |
| </code></pre> |
| <p>This will delete objects ‘README3.md’ and ‘README4.md’ from Ozone volume ‘s3v’ in bucket ‘bucket1’.</p> |
| <h3 id="multipart-upload">Multipart upload</h3> |
| <pre><code>response = s3_client.create_multipart_upload(Bucket='bucket1', Key='key1') |
| print(response) |
| uid=response['UploadId'] |
| print(uid) |
| |
| response = s3_client.upload_part_copy( |
| Bucket='bucket1', |
| CopySource='/bucket1/maven.gz', |
| Key='key1', |
| PartNumber=1, |
| UploadId=str(uid) |
| ) |
| print(response) |
| etag1=response.get('CopyPartResult').get('ETag') |
| print(etag1) |
| |
| response = s3_client.upload_part_copy( |
| Bucket='bucket1', |
| CopySource='/bucket1/maven1.gz', |
| Key='key1', |
| PartNumber=2, |
| UploadId=str(uid) |
| ) |
| print(response) |
| etag2=response.get('CopyPartResult').get('ETag') |
| print(etag2) |
| |
| response = s3_client.complete_multipart_upload( |
| Bucket='bucket1', |
| Key='key1', |
| MultipartUpload={ |
| 'Parts': [ |
| { |
| 'ETag': str(etag1), |
| 'PartNumber': 1, |
| }, |
| { |
| 'ETag': str(etag2), |
| 'PartNumber': 2, |
| }, |
| ], |
| }, |
| UploadId=str(uid), |
| ) |
| print(response) |
| </code></pre> |
| <p>This will use ‘maven.gz’ and ‘maven1.gz’ as copy source from Ozone volume ‘s3v’ to create a new object ‘key1’ |
| in Ozone volume ‘s3v’. Please note ‘ETag’s is required and important for the call.</p> |
| |
| |
| |
| <a class="btn btn-success btn-lg" href="../recipe/prometheus.html">Next >></a> |
| |
| </div> |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="push"></div> |
| </div> |
| |
| |
| |
| <footer class="footer"> |
| <div class="container"> |
| <span class="small text-muted"> |
| Version: 1.1.0, Last Modified: March 2, 2021 <a class="hide-child link primary-color" href="https://github.com/apache/ozone/commit/b07162b5cea577a2c785cc93fb6953c8628fbf5f">b07162b5c</a> |
| </span> |
| </div> |
| </footer> |
| |
| |
| |
| <script src="../js/jquery-3.5.1.min.js"></script> |
| <script src="../js/ozonedoc.js"></script> |
| <script src="../js/bootstrap.min.js"></script> |
| |
| |
| </body> |
| |
| </html> |