Chapter 02

オブジェクトストレージにアクセスしてみる / boto3

Akane
Akane
2021.02.21に更新

Cloudianは、AWSのS3完全互換のAPIを持ったオブジェクトストレージです。

S3互換APIなので、AWS SDK を使用して操作可能なのですが、S3に接続する前提の記事が多いので、S3以外のオブジェクトストーレージへ接続する方法を書こうと思います。

今回は、AWS SDK for Python(boto3)を使って、オブジェクトストレージのバケット一覧(バケットリスト)を取得できるとこまで確認していきます。

1. AWS SDK for Python(boto3)のインストール

S3 のファイルを操作するためには、Pythonで AWS SDK for Python(以下boto3)をインポートする必要があります。boto3はpipコマンドで簡単にインストールできます

$ pip install boto3

2. クレデンシャル情報の設定

Python から boto3 を利用するために、クレデンシャル情報(アクセスキーとシークレットキー)の設定を行います。AWS CLIをインストールすれば、簡単設定できます

AWS CLIのインストール

pipコマンドでインストールします

$ pip install awscli

Configure設定

aws configureコマンドを実行します

  • Cloudianのクレデンシャル情報(アクセスキーとシークレットキー)を入力
  • Default region nameは、空エンター入力
  • Default output formatは、 jsonと入力
$ aws configure

AWS Access Key ID: xxxxxxxxxxxxxxxxx
AWS Secret Access Key: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Default region name: 
Default output format: json

これでクレデンシャル情報の設定完了です。設定した内容は、「~/.aws/credentials」と「~/.aws/config」で確認できます。

$ cat ~/.aws/credentials

[default]  
aws_access_key_id = xxxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy


$ cat ~/.aws/config

[default]
output=json

boto3のimport

S3 のファイルを操作するためには、Pythonでboto3をimportする必要があります。

import boto3

client = boto3.client(
    's3',
    endpoint_url='https://xxx.yyy.com'
)

boto3.clientの引数として、以下のものを設定します。

  • 第一引数には、AWSのサービス種別を設定します。ここには、's3’ を設定します。
    ※ boto3 自体は、AWS の S3 以外のサービスのためのメソッドも提供しています。

  • 第二引数には、AWSのエンドポイントではなく、オブジェクトストレージのS3エンドポイントを指定するために、「endopoint_url=’オブジェクトストレージ の S3 エンドポイント’」を設定します。

client = boto3.client('s3', endpoint_url='https://xxx.yyy.com')

AWS のサービス種別として ’s3’ を、S3 エンドポイントの URL としてendpoint_url='http://xxx.yyy.com' を設定しています。

endpoint_url の設定により、デフォルトの参照先である AWS の S3 エンドポイントを、オブジェクトストレージ の S3 エンドポイントに上書きしています。

参考情報)Pythonプログラム内でクレデンシャル情報を設定したい場合(AWS CLI/Configure設定で行わない場合)
boto3.clientパラメータに、クレデンシャル情報(アクセスキーとシークレットキー)を渡して接続する方法もあります。

 client = boto3.client(
    's3',
    endpoint_url='https://xxx.yyy.com',
    
    # Hard coded strings as credentials, not recommended.
    aws_access_key_id='xxxxxxxxxxxxxxxxxxxx',
    aws_secret_access_key='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
)

注)AWS CLI/Configure設定なしですぐ試せますが、認証情報をプログラムに記述することは推奨されません(検証目的用途になります)

_

参考情報)S3オブジェクトの作成について
boto3 を含む AWS SDK では S3 API に 1:1 で対応する「低レベルAPI」と、より高度な操作を行うことができるオブジェクト指向の「高レベルAPI」が提供されています。

・Client API (低レベルAPI) : S3Client(boto3.client)
AWSのREST APIと1対1で対応した作りになっている。

・Resource API (高レベルAPI) : S3Resource(boto3.resource)
AWSリソースをオブジェクト指向で取り扱えるようになっている。

今回のサンプルでは、低レベルAPIであるS3Client(boto3.client) オブジェクトを使用してます。

3. 動作確認

test.py
import boto3

client = boto3.client(
    's3',
    endpoint_url='https://xxx.yyy.com'
)

# バケット一覧を取得
client.list_buckets()

上記コードを実行して、オブジェクトストレージ/Cloudianに設定したバケットの一覧を取得できます。

$ python test1.py 

{'ResponseMetadata': {'RequestId': '9dad38b5-0e30-1dbc-a754-06bdfcde1d5e',
  'HostId': '',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'date': 'Sun, 13 Dec 2020 21:57:43 GMT',
   'x-amz-request-id': '9dad38b5-0e30-1dbc-a754-06bdfcde1d5e',
   'content-type': 'application/xml;charset=UTF-8',
   'content-length': '519',
   'server': 'CloudianS3'},
  'RetryAttempts': 0},
 'Buckets': [{'Name': 'bucket1',
   'CreationDate': datetime.datetime(2020, 12, 1, 3, 2, 25, 876000, tzinfo=tzutc())},
  {'Name': 'pythonbucket2',
   'CreationDate': datetime.datetime(2020, 12, 13, 19, 51, 20, 267000, tzinfo=tzutc())},
  {'Name': 'pythonbucket3',
   'CreationDate': datetime.datetime(2020, 12, 13, 21, 41, 8, 495000, tzinfo=tzutc())}],
 'Owner': {'DisplayName': '', 'ID': '27b8e84694ca0b529d5379049564ebe1'}}

まとめ

Pythonプログラムで作成した boto3のS3Clientオブジェクトには、オブジェクトストレージ/Cloudianに対して様々な操作(バケットの作成/削除やデータのアップロード/ダウンロード等々)を行うことができる多くのメソッドが用意されています。

S3Client(boto3.client)で使用可能なメソッドの詳細情報
https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

次回は、このS3Clientオブジェクトを使用して、オブジェクトストレージであるCloudianをいろいろ操作していきたいと思います。