日々精進

新しく学んだことを書き留めていきます

S3から正規表現に一致するファイルをすべてダウンロードする

boto3に普通にありそうな機能だけど見付からなかったので実装。

def download_object_from_s3(remote_path: str) -> io.BytesIO:
    """S3からオブジェクトをダウンロードしてreturnする
    Args:
        remote_path (str): ダウンロード元のS3のパス
    Returns:
        S3からダウンロードしたオブジェクト
    """
    data: io.BytesIO = io.BytesIO()
    s3: ServiceResource = boto3.resource('s3',
                                         aws_access_key_id=ACCESS_KEY,
                                         aws_secret_access_key=SECRET_ACCESS_KEY)
    s3.Bucket(BUCKET).download_fileobj(remote_path, data)
    data.seek(0)
    return data


def download_object_list_from_s3(pattern: str) -> List[S3Object]:
    regex = re.compile(pattern)
    s3: ServiceResource = boto3.resource('s3',
                                         aws_access_key_id=ACCESS_KEY,
                                         aws_secret_access_key=SECRET_ACCESS_KEY)
    objects = s3.Bucket(BUCKET).objects.all()
    result: list = []
    for a_object in objects:
        if regex.match(a_object.key):
            content: io.BytesIO = download_object_from_s3(a_object.key)
            result.append(S3Object(a_object.key, content))
    return result

download_object_list_from_s3("mydir/.+.jpg") のように使えます。便利。

参考:

stackoverflow.com