はじめに
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. 動作確認
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'}}
4. まとめ
Pythonプログラムで作成した boto3のS3Clientオブジェクトには、オブジェクトストレージ/Cloudianに対して様々な操作(バケットの作成/削除やデータのアップロード/ダウンロード等々)を行うことができる多くのメソッドが用意されています。
S3Client(boto3.client)で使用可能なメソッドの詳細情報
https://boto3.amazonaws.com/v1/documentation/api/latest/index.html
次回は、このS3Clientオブジェクトを使用して、オブジェクトストレージであるCloudianをいろいろ操作していきたいと思います。