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_NAME
と AWS_S3_BUCKET_NAME
は目的に合わせて設定します。
指定バケット上のフォルダ一覧を取得する処理になっています。
(厳密には、S3にフォルダの概念はないですが)
実行
$ python folder_list.py
sync/
sync/dir1/
sync/dir1/dir1_1/
sync/dir1/dir1_2/