概要
特定のバケットからファイルをすべて取得したいときにコンソールからだと面倒だったので、
バケットを指定することでファイルを一括で取得できるツールを作ってみました。
(たぶん既にありそうですが・・・)
取得だけでなく削除処理もつけてみました。
(こちらを使用して何か起こっても自己責任でお願いします。)
使用ライブラリ
- boto3を使っています。
- exeに固めるため PyInstaller を使用しています。
ツールの説明
ソース自体はこちらで公開しています。
ツールを起動すると以下のようになります
-
こちらはtkinterを使用して作成しています。
-
バケット名はプロパティに設定しているので適宜設定できます。
-
処理内容はファイル取得か削除かを選択できます。
-
フォルダ指定はファイル取得するときにどこに格納するかを選択します。
-
プロパティファイルにaccess keyとsecret access keyを設定する形になっていますが、 aws configure でアカウントの設定していればこちらの設定は不要です
-
ソースのS3に関する部分は以下になります。
if aws_access_key_id =='':
s3 = boto3.resource('s3')
s3client=boto3.client('s3')
else:
s3 = boto3.resource('s3',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key_id)
s3client=boto3.client('s3',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key_id)
bucketName=self.inputFileName.get()
resultFolder=self.outputFolder.get()
dataBaseDir=os.path.join(resultFolder,bucketName)
executeType=EXECUTE_LIST.index(self.combo.get())
s3bucket=s3.Bucket(bucketName)
objs = s3bucket.meta.client.list_objects_v2(Bucket=s3bucket.name)
for o in objs.get('Contents'):
key = o.get('Key')
s3Paths=os.path.splitext(key)
if len(s3Paths[1]) !=0:
keys=key.split('/')
filename=keys[len(keys)-1]
if executeType==0:
outputDataDir=key.split(filename)[0]
outputDataDir=os.path.join(dataBaseDir,outputDataDir)
os.makedirs(outputDataDir,exist_ok=True)
outputDataFile=os.path.join(outputDataDir,filename)
s3bucket.download_file(key,outputDataFile)
else:
s3client.delete_object(Bucket=s3bucket.name, Key=key)
- ツールの方から入力されたバケット名、処理内容をもとに度の処理を動かすかを判定しています。
- 対象のバケットの中は
objs = s3bucket.meta.client.list_objects_v2(Bucket=s3bucket.name)
の部分で取得できるのであとはfor文で処理をしています。
引数にPrefix
を追加することで特定のフォルダ、ファイルのみを指定することも可能です。
- ソースを実行しても確認ができますが、クライアントアプリとして使う場合は以下のコマンドでexeを作成します。 ソースのファイル名を
pythonGui.py
とした場合以下のようになります。- pyinstaller pythonGui.py --onefile