S3 から CLI を使い ”最終更新日” の期間指定でオブジェクトをダウンロードする

## はじめに

最終更新日をキーとして、S3バケットから指定期間内に更新されたオブジェクト（ファイル）をダウンロードするスクリプトです。

## 背景と必要性

たくさんのファイルが格納されているS3のバケットから特定期間に格納したファイルをダウンロードしようと思ったのですが、ご覧の通りAWSのマネジメントコンソールでは`オブジェクト名`以外の項目では表示順を変えられないっぽいのと、ダウンロード対象のファイル数が結構多そうだったので、手作業はきついなと思い CLIをたたくスクリプトを書きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/466da7a3-bdaf-505e-9829-15146508c7c9.png)

## スクリプト

必要な情報をパラメータで指定して実行すれば繰り返し利用できるような形でまとめてみました。

```powershell:DownloadS3Obj.ps1
<#
.SYNOPSIS
    S3から指定した期間（最終更新日時）のファイルをダウンロードします。

.DESCRIPTION
    特になし

.PARAMETER bucketName
    バケット名を指定します。

.PARAMETER prefix
    フォルダのパスを指定します。

.PARAMETER from
    ダウンロードするファイルの最終更新日（最小値）を指定します。

.PARAMETER to
    ダウンロードするファイルの最終更新日（最大値）を指定します。
#>

Param(
    [string]$bucketName,
    [string]$prefix,
    [string]$from,
    [string]$to
)

$outputDir = "$(Get-Date -Format 'yyyyMMddHHmmss')"

# ダウンロード先フォルダの作成
New-Item -ItemType Directory -Name $outputDir

# ファイルをダウンロード
aws s3api list-objects `
     --bucket $bucketName `
     --prefix $prefix `
     --query "Contents[?LastModified>='$from' && LastModified<='$to'].[Key]" `
     --output text `
| ForEach-Object { aws s3 cp --no-progress s3://$bucketName/$_ ./$outputDir/ }
```

特に解説とかはありませんが、せっかくなので`ChatGPT`に説明してもらいましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/436f62cc-60ad-45af-1416-cd2fa925e9aa.png)


### 実行例

```powershell
PS C:\Users\xxxx\Desktop> .\DownloadS3Obj.ps1 -bucketName bucket-logcsv -prefix 3b077cad-fda9-4d1b6/ -from 2022-03-08 -to 2022-03-10

    ディレクトリ: C:\Users\xxxx\Desktop


Mode                 LastWriteTime         Length Name                                                                                                                                                                      
----                 -------------         ------ ----                                                                                                                                                                      
d-----        2023/02/16     16:55                20230216165519                                                                                                                                                            
download: s3://bucket-logcsv/3b077cad-fda9-4d1b6/0072046a-7b1d-4944-855b.csv to 20230216165519\0072046a-7b1d-4944-855b.csv
download: s3://bucket-logcsv/3b077cad-fda9-4d1b6/00b8ecca-850e-4020-affc.csv to 20230216165519\00b8ecca-850e-4020-affc.csv
download: s3://bucket-logcsv/3b077cad-fda9-4d1b6/010bdb06-4673-40ba-9ef2.csv to 20230216165519\010bdb06-4673-40ba-9ef2.csv
download: s3://bucket-logcsv/3b077cad-fda9-4d1b6/0377154b-8ee7-4f9e-abb1.csv to 20230216165519\0377154b-8ee7-4f9e-abb1.csv
download: s3://bucket-logcsv/3b077cad-fda9-4d1b6/03e3e00b-5362-4837-855c.csv to 20230216165519\03e3e00b-5362-4837-855c.csv
download: s3://bucket-logcsv/3b077cad-fda9-4d1b6/04b2fd8f-3b4c-4e3d-b432.csv to 20230216165519\04b2fd8f-3b4c-4e3d-b432.csv
download: s3://bucket-logcsv/3b077cad-fda9-4d1b6/05846e8a-758c-467d-b226.csv to 20230216165519\05846e8a-758c-467d-b226.csv
```

## まとめ

スクリプトを作るにあたり、ぱっと見ではネット上にそのまま使える情報を見つけられなかったので、メモとして記事にしました。