[Boto3 Adv-Cal DAY2]S3へのファイルアップを試してみた

boto3 で楽しむ AWS PythonLife 一人AdventCalendarです。2日目はs3からのバケット作成とファイルアップ、及び成功チェックをやってみました。
2018.12.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

boto3 で楽しむ AWS PythonLife 一人AdventCalendarです。

boto3のドキュメントを通して、サービス別にどういった事が出来るのかを理解したり、管理コンソールを通さずにTerminalだけで完結できるように検証していくことが目的になります。

2日目はS3へのファイルアップ及びチェックを試してみました。

目次

boto/s3transfer との違い

This project is not currently GA. If you are planning to use this code in production, make sure to lock to a minor version as interfaces may break from minor version to minor version. For a basic, stable interface of s3transfer, try the interfaces exposed in boto3

とあるように、boto3のインターフェイスによるコーディングを行うべきです。

boto3を通してS3で出来ること

ドキュメントは下記リンク先です。

ざっくりと以下のことができます。

  • Bucketの作成・設定変更
  • マルチパートアップロード
  • オブジェクトベースでの操作

今回の操作

今回はとてもシンプルに以下の流れで行います。

  1. Bucketの作成
  2. ファイルのアップ
  3. 存在確認
import boto3
import os

def main():
    bucket_name = 'XXXXXXXX-solo-advent-calendar'
    file_name = '.vimrc'

    session = boto3.Session(region_name="us-east-1", profile_name="advent_calendar")
    client = session.client('s3')
    bucket_list = client.list_buckets()['Buckets']
    if bucket_name not in [bucket['Name'] for bucket in bucket_list]:
        client.create_bucket(ACL='private', Bucket=bucket_name)
        bucket = client.Bucket(bucket_name)
        bucket.wait_until_exists()
    
    client.upload_file(os.path.expanduser('~/{}'.format(file_name)), bucket_name, file_name)
    object = client.Object(bucket_name, file_name)
    object.wait_until_exists():

if __name__ == '__main__':
    main()

Sessionへのregion指定

何も指定しない場合はプロファイルadvent_calendarに設定済みのea-northeast-1が適用されてエラーとなります。上書きする形でregion_name="us-east-1"を指定しています。

wait_until_exists

5秒毎に成功するまでチェックを繰り返します。20回を超えた時点でエラーとなります。今回は特に失敗による影響もないためフェイルセーフを挟んでいません。

まとめ

最低限の操作だけに留めたため相当シンプルな内容になりましたが、Pythonによるコーディングの場合は上記のような構成になります。

単純なアップロードの場合はawscliによる操作にて簡潔に完了できるはずです。