はじめに
AWS SDK for Python(boto3) を使って、プログラムをほぼ変更せずに Cloudian と S3 へのアクセスが可能となります。オブジェクトストレージをハイブリッド(オンプレミス:Cloudian、AWS:S3)で使いたい方への参考になればと、、、
概要
オブジェクトストレージ Cloudian/S3 上のバケット名「boto3-cloudian」にあるJSON形式のデータファイルから特定のデータを抽出する Python プログラムです。
JSON形式のデータファイルは、これ で生成した「test-iot-dummy.json」となり、10万件のデータが存在しています。そのデータから、項目「section」=「R」のものを抽出し、そのデータ件数と抽出に掛かった時間を表示します。
抽出項目「section」はパラメータとして定義することも可能です(アルファベット大文字1文字)。プログラム実行時に、パラメータ「-h」を指定することにより表示されるヘルプも参照ください。
実行環境
macOS Big Sur 11.1
python 3.8.3
クレデンシャル情報の定義
今回はクレデンシャル情報を .zshenv に定義してプログラムを実行しています。接続先に合わせて定義ください。
# AWS S3
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyy
export AWS_DEFAULT_REGION=ap-northeast-1
# Cloudian
#export AWS_ACCESS_KEY_ID=aaaaaaaaaaaaaaaaaa
#export AWS_SECRET_ACCESS_KEY=bbbbbbbbbbbbbbbbbbbb
#export AWS_DEFAULT_REGION=pic
実行プログラム
Cloudianへアクセスする場合は endpoint_url を記載ください(プログラム内を参照ください)。
import json
import time
import argparse
import boto3
BUCKET_NAME = 'boto3-cloudian'
OBJECT_KEY = 'test-iot-dummy.json'
# S3-APIで全データ取得してロジックでフィルタ(項目:Section)
def section_main(section):
# client = boto3.client('s3', endpoint_url='http://s3-pic.networld.local') # Cloudianへのアクセス時
client = boto3.client('s3') # S3へのアクセス時
response = client.get_object(
Bucket=BUCKET_NAME,
Key=OBJECT_KEY
)
target = []
if 'Body' in response:
body = response['Body'].read()
text = body.decode('utf-8')
items = json.loads(text)
items = items['items']
target = list(filter(lambda x: x['section'] == section, items))
# print(target)
return len(target)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='IoT機器のなんちゃってダミーデータの抽出')
parser.add_argument('--section', type=str, default='R', help='抽出するセクションの指定(アルファベット大文字1文字)')
args = parser.parse_args()
start = time.time()
num = section_main(args.section)
select_time = time.time() - start
print("")
print(f"データ抽出件数:{num}")
print("抽出処理時間(通常_API):{0}".format(select_time) + " [sec]")
print("")
プログラムの実行
最初にヘルプを表示してみます。
$ python IoTSample-read.py -h
usage: IoTSample-read.py [-h] [--section SECTION]
IoT機器のなんちゃってダミーデータの抽出
optional arguments:
-h, --help show this help message and exit
--section SECTION 抽出するセクションの指定(アルファベット大文字一文字)
では、デフォルトの抽出項目でデータ抽出を実行してみます。
$ python IoTSample-read.py
データ抽出件数:3929
抽出処理時間(通常_API):3.6708199977874756 [sec]
次に、抽出項目を指定した場合の実行です。
$ python IoTSample-read.py --section Z
データ抽出件数:3792
抽出処理時間(通常_API):3.5160200595855713 [sec]
まとめ
今回は、AWS SDK for Python(boto3) を使って、オブジェクトストレージ Cloudian / S3 からデータを抽出することを確認できました(10万件のデータから数秒で目的のデータを抽出完了(もちろん環境に依存します))。
Cloudianについては、ここ を確認ください。