Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

はじめに

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'}}

4. まとめ

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

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

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

networld
先進的な製品を活用したソリューションを提供します
https://www.networld.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away