[Cloudian #2] Python(boto3)で、オブジェクトストレージのバケットを表示してみる


## はじめに
[Cloudian](https://cloudian.com/jp/)は、AWSのS3完全互換のAPIを持ったオブジェクトストレージです。
[前回](https://qiita.com/Akanechan/items/7b8a11c773106b641795)は、AWS SDKのクレデンシャル設定をして、Python(boto3)で、とりあえずオブジェクトストレージにアクセスしてみました

今回は、Python(boto3)で、作成済みバケットをいろんなパターンで表示してみたいと思います。


## 作成済みバケットの表示 / list_buckets()
アクセスキーとシークレットキーで認証されたユーザーが所有する、全てのバケットの情報を返します。
戻り値は、Python の辞書(dict)型として返されます。


## 1. 加工せずに表示
以下の例では、list_buckets()を単純に呼び出して、全ての戻り値を表示しています。

```python:test1.py
import boto3

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

# バケット一覧を取得
response = client.list_buckets()
print(response)
```

```shell
{'ResponseMetadata': {'RequestId': '9dad38b7-0e30-1dbc-a754-06bdfcde1d5e',
  'HostId': '',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'date': 'Sun, 13 Dec 2020 21:58:07 GMT',
   'x-amz-request-id': '9dad38b7-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'}}

```

list_buckets()からは非常に多くの情報が返されるため、以降の例では出力を絞り込んで 表示させていきます。


## 2. バケットに関する情報を絞り込んで表示（各バケット名と作成日時）
list_buckets()で返された辞書型の戻り値から、辞書キー「Buckets」の値を抽出し、さらに「Name」(バケット名)と「CreationDate」(作成日付)に絞り込んで表示させています。

```python:test2.py
import boto3

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

# バケット一覧を取得
for bucket in client.list_buckets()['Buckets']:
    print(bucket['Name'], bucket['CreationDate'])
```

```shell
bucket1 2020-12-01 03:02:25.876000+00:00
pythonbucket2 2020-12-13 19:51:20.267000+00:00
pythonbucket3 2020-12-13 21:41:08.495000+00:00
```

list_buckets()は辞書(dict)型で作成済みバケット に関する情報を戻しますので、プログラムで必要となるデータのみを Python プログラムで抽出することができます。

>  string 型のバケット名と、datetime 型の作成日付のみを抽出してます


## 3. バケットに関する情報に絞り込んで表示し、作成日時を整形（各バケット名と作成日時）
バケット名とその作成日付に絞り込み、表示される作成日付を整形しています。

```python:test3.py
import boto3

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

# バケット一覧を取得
for bucket in client.list_buckets()['Buckets']:
    print(bucket['Name'],bucket['CreationDate'].strftime("%Y/%m/%d %H:%M:%S"))
```

```shell
bucket1 2020/12/01 03:02:25
pythonbucket2 2020/12/13 19:51:20
pythonbucket3 2020/12/13 21:41:08
```

datetime 型で戻される作成日付(CreationDate)を、Python 標準モジュールに含まれる strftime()を使って見やすいように整形して出力しています。


## 4. バケットに関する情報を見やすく表示（各バケット名と作成日時）
出力されるバケット作成日付に+9時間して、日本時間で表示しています。

```python:test4.py
import boto3

# 追加モジュール
import datetime


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


# バケット一覧を取得
for bucket in client.list_buckets()['Buckets']: 
    print('%s (%s)' % (bucket['Name'], (bucket['CreationDate'] + datetime.timedelta(hours=9)).strftime("%Y/%m/%d %H:%M:%S")))
```

```shell
bucket1 (2020/12/01 12:02:25)
pythonbucket2 (2020/12/14 04:51:20)
pythonbucket3 (2020/12/14 06:41:08)
```

## 5. まとめ
Python(boto3)で、作成済みバケットをいろんなパターンで表示してみました。

[次回](https://qiita.com/Akanechan/items/14a7070d733dbad09597)も、Pythonでオブジェクトストレージ/Cloudianをいろいろ操作していきたいと思います。