AWS CLIでS3操作(ls,mb,rb,cp,mv,rm,sync)

AWS CLIを利用したS3の操作方法を確認します。オブジェクト一覧表示、バケットの作成、ローカルファイルのアップロードなど取り上げます。また、boto3を活用したS3の操作方法についても確認します。

ls|一覧表示

参考) https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html

バケット一覧

$ aws s3 ls
2019-03-29 08:19:26 abc-test-bucket
2019-03-29 08:21:16 abc-test2-bucket

オブジェクト一覧

$ aws s3 ls s3://abc-test-bucket/
                           PRE sync/
2019-03-30 08:13:29          0 test1.csv

再帰的表示( recursive )

$ aws s3 ls s3://abc-test-bucket/ --recursive
2019-03-30 08:32:45          0 sync/
2019-03-30 08:40:47          0 sync/dir1/dir1_1/test1.csv
2019-03-30 08:40:47          0 sync/dir1/dir1_1/test1.txt
2019-03-30 08:40:47          0 sync/dir1/dir1_1/test2.txt
2019-03-30 08:40:47          0 sync/dir1/dir1_1/test3.txt
2019-03-30 08:40:47          0 sync/dir1/dir1_2/test2.csv
2019-03-30 08:40:47          0 sync/test4.txt
2019-03-30 08:38:39          0 sync/xxxxxxxxxx.txt
2019-03-30 08:13:29          0 test1.csv

mb|バケットを作成

参考) https://docs.aws.amazon.com/cli/latest/reference/s3/mb.html

$ aws s3 mb s3://abc-test-bucket
make_bucket: abc-test-bucket
$ 
$ aws s3 ls
2019-03-29 08:19:26 abc-test-bucket

rb|バケットを削除

参考) https://docs.aws.amazon.com/cli/latest/reference/s3/rb.html

$ aws s3 ls
2019-03-29 08:19:26 abc-test-bucket
2019-03-29 08:21:16 abc-test2-bucket
$ 
$ aws s3 rb s3://abc-test2-bucket
remove_bucket: abc-test2-bucket
$ 
$ aws s3 ls
2019-03-29 08:19:26 abc-test-bucket

cp

参考) https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html

ローカルファイルをバケットにコピー

$ ls
test1.csv       test1.md        test1.txt
$
$ aws s3 cp test1.txt s3://abc-test-bucket
upload: ./test1.txt to s3://abc-test-bucket/test1.txt
$
$ aws s3 ls s3://abc-test-bucket
2019-03-29 08:29:29          0 test1.txt
$
$ ls
test1.csv       test1.md        test1.txt

ローカルファイルをバケットにアップロードできました。
ローカルファイルは残ったままです。

オブジェクトをダウンロード

$ aws s3 ls s3://abc-test-bucket/ --recursive
2019-03-29 13:37:16          0 dir/test1.md
2019-03-29 13:37:16          0 test1.csv
2019-03-29 13:37:16          0 test1.txt
$
$ ls

バケットにオブジェクトが存在して、ローカルには何もない状態です。

$ aws s3 cp s3://abc-test-bucket/ . --recursive
download: s3://abc-test-bucket/test1.csv to ./test1.csv
download: s3://abc-test-bucket/test1.txt to ./test1.txt
download: s3://abc-test-bucket/dir/test1.md to dir/test1.md

バケットのオブジェクトをダウンロードできました。

$ aws s3 ls s3://abc-test-bucket/ --recursive
2019-03-29 13:37:16          0 dir/test1.md
2019-03-29 13:37:16          0 test1.csv
2019-03-29 13:37:16          0 test1.txt
$
$ ls
dir             test1.csv       test1.txt

バケットのオブジェクトは残ったままです。

mv|ローカルファイルをバケットに移動

参考) https://docs.aws.amazon.com/cli/latest/reference/s3/mv.html

$ ls
test1.csv       test1.md        test1.txt
$
$ aws s3 mv test1.csv s3://abc-test-bucket/
move: ./test1.csv to s3://abc-test-bucket/test1.csv
$ 
$ aws s3 ls s3://abc-test-bucket/
2019-03-30 08:13:29          0 test1.csv
2019-03-29 08:29:29          0 test1.txt
$ 
$ ls
test1.md        test1.txt

ローカルファイルをバケットにアップロードできました。
ローカルファイルは削除されます。

rm|オブジェクトを削除

参考) https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html

$ aws s3 ls s3://abc-test-bucket/
2019-03-30 08:13:29          0 test1.csv
2019-03-29 08:29:29          0 test1.txt
$ 
$ aws s3 rm s3://abc-test-bucket/test1.txt
delete: s3://abc-test-bucket/test1.txt
$ 
$ aws s3 ls s3://abc-test-bucket/
2019-03-30 08:13:29          0 test1.csv

バケット上の test1.txt を削除しました。

sync|ローカルフォルダとの同期

参考) https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

追加・更新
( ローカルの内容をS3と同期 )

sync実行前

$ aws s3 ls s3://abc-test-bucket/ --recursive
2019-03-30 08:32:45          0 sync/
2019-03-30 08:38:39          0 sync/xxxxxxxxxx.txt
2019-03-30 08:13:29          0 test1.csv
$ tree
.
├── dir1
│   ├── dir1_1
│   │   ├── test1.csv
│   │   ├── test1.txt
│   │   ├── test2.txt
│   │   └── test3.txt
│   ├── dir1_2
│   │   └── test2.csv
│   └── dir1_3
├── test1.md
└── test4.txt

4 directories, 7 files

sync実行

$ aws s3 sync . s3://abc-test-bucket/sync
upload: dir1/dir1_1/test1.csv to s3://abc-test-bucket/sync/dir1/dir1_1/test1.csv
upload: dir1/dir1_1/test3.txt to s3://abc-test-bucket/sync/dir1/dir1_1/test3.txt
upload: ./test1.md to s3://abc-test-bucket/sync/test1.md
upload: dir1/dir1_1/test2.txt to s3://abc-test-bucket/sync/dir1/dir1_1/test2.txt
upload: dir1/dir1_1/test1.txt to s3://abc-test-bucket/sync/dir1/dir1_1/test1.txt
upload: ./test4.txt to s3://abc-test-bucket/sync/test4.txt
upload: dir1/dir1_2/test2.csv to s3://abc-test-bucket/sync/dir1/dir1_2/test2.csv

sync実行後

$ tree
.
├── dir1
│   ├── dir1_1
│   │   ├── test1.csv
│   │   ├── test1.txt
│   │   ├── test2.txt
│   │   └── test3.txt
│   ├── dir1_2
│   │   └── test2.csv
│   └── dir1_3
├── test1.md
└── test4.txt

4 directories, 7 files
$ aws s3 ls s3://abc-test-bucket/ --recursive
2019-03-30 08:32:45          0 sync/
2019-03-30 08:40:47          0 sync/dir1/dir1_1/test1.csv
2019-03-30 08:40:47          0 sync/dir1/dir1_1/test1.txt
2019-03-30 08:40:47          0 sync/dir1/dir1_1/test2.txt
2019-03-30 08:40:47          0 sync/dir1/dir1_1/test3.txt
2019-03-30 08:40:47          0 sync/dir1/dir1_2/test2.csv
2019-03-30 08:40:47          0 sync/test1.md
2019-03-30 08:40:47          0 sync/test4.txt
2019-03-30 08:38:39          0 sync/xxxxxxxxxx.txt
2019-03-30 08:13:29          0 test1.csv

ローカルに存在して、S3に存在しないファイルがアップロードされました。

追加・更新
( S3の内容をローカルと同期 )

$ aws s3 sync s3://abc-test-bucket/sync .
download: s3://abc-test-bucket/sync/xxxxxxxxxx.txt to ./xxxxxxxxxx.txt

S3に存在して、ローカルに存在しないファイルがダウンロードされました。

削除
( ローカルの内容をS3と同期 )

デフォルトだと削除はされません。同期する際に、ローカルで削除したファイルをS3でも削除するには --deleteオプション を利用します。

$ rm test1.md 
$ 
$ aws s3 sync . s3://abc-test-bucket/sync
$ 
$ aws s3 sync . s3://abc-test-bucket/sync --delete
delete: s3://abc-test-bucket/sync/test1.md

オプション
( cp, mv, rm, syncで利用可能 )

--dryrun

実際にはオブジェクト操作が行われず、シミュレーション結果を確認できます。

--exclude, --include

参考) https://docs.aws.amazon.com/cli/latest/reference/s3/index.html#use-of-exclude-and-include-filters

指定パターンに一致したオブジェクトを除外したり、含めることができます。

パターン記号

記号 概要
* 全ての文字列にマッチ
任意の1文字にマッチ
[シーケンス] シーケンス内の任意の文字に一致
[!シーケンス] シーケンスにない任意の文字に一致

後半のルールが優先されます。

# オブジェクト名の最後が 「.json」 となるオブジェクトのみ対象になります。
--exclude "*" --include "*.json"

# --excludeが後半に書かれているので全て対象外になります。
--include "*.txt" --exclude "*"

boto3を利用してフォルダ一覧を表示

boto3をインストール

pythonのboto3をインストールします。

pip install boto3

コード

folder_list.py というファイルに以下処理を記述します。

import boto3
from boto3.session import Session

def list(prefix):
    result = client.list_objects(Bucket=bucket.name, Prefix=prefix, Delimiter='/')
    objects = result.get('CommonPrefixes')

    if objects:
        for object in objects:
            prefix = object.get('Prefix')
            print(prefix)
            list(prefix)
    return

PROFILE_NAME = 'xxxxxxxxxx'
session = Session(profile_name=PROFILE_NAME)
s3 = session.resource('s3')

AWS_S3_BUCKET_NAME = 'abc-test-bucket'
bucket = s3.Bucket(AWS_S3_BUCKET_NAME)
client = bucket.meta.client
list('')

PROFILE_NAMEAWS_S3_BUCKET_NAME は目的に合わせて設定します。

指定バケット上のフォルダ一覧を取得する処理になっています。
(厳密には、S3にフォルダの概念はないですが)

実行

$ python folder_list.py 
sync/
sync/dir1/
sync/dir1/dir1_1/
sync/dir1/dir1_2/

参考

わくわくBank.
技術系の記事を中心に、役に立つと思ったこと、整理したい情報などを掲載しています。