[Cloudian #1] AWS SDK for Python(boto3)で、オブジェクトストレージにアクセスしてみる


## はじめに

[Cloudian](https://cloudian.com/)は、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と入力

```shell
$ aws configure

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

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

```shell
$ 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する必要があります。

```python
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パラメータに、クレデンシャル情報(アクセスキーとシークレットキー)を渡して接続する方法もあります。
  
> ```python
>  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. 動作確認
```python:test.py
import boto3

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

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


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

```shell
$ 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
    

[次回](https://qiita.com/Akanechan/items/683a5e9eed43a09993d1)は、このS3Clientオブジェクトを使用して、オブジェクトストレージであるCloudianをいろいろ操作していきたいと思います。