(AWS CLI)S3を使う

AWS CLIで S3を使用してみます。

使用バージョンはこれです。

ec2-user@ip-abc-abc-abc-abc$ aws --version
aws-cli/2.2.23 Python/3.8.8 Linux/4.14.193-113.317.amzn1.x86_64 exe/x86_64.amzn.2018 prompt/off
ec2-user@ip-abc-abc-abc-abc$

aws cliの操作は、EC2上でも、ローカルPCでも可能です。

スポンサーリンク

AWS CLIでS3を使う

aws s3 mb バケットの作成

コマンド aws s3 mb s3://S3バケット名

使い方は、aws s3 mb helpで確認できます。

〜省略〜
EXAMPLES
       The  following  mb command creates a bucket.  In this example, the user
       makes the bucket mybucket.  The bucket is created in the region  speci-
       fied in the user's configuration file:

          aws s3 mb s3://mybucket

       Output:

          make_bucket: s3://mybucket
〜省略〜

まだバケット作成前なので、aws s3 lsでは何も表示されません。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls
ec2-user@ip-abc-abc-abc-abc$

ではバケットを作成します。バケット名はtakk-bucket-sample-1にします。

ec2-user@ip-abc-abc-abc-abc$$ aws s3 mb s3://takk-bucket-sample-1
make_bucket: takk-bucket-sample-1
ec2-user@ip-abc-abc-abc-abc$

バケットが作成されました。aws s3 lsで確認します。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls
2021-10-10 04:24:01 takk-bucket-sample-1
ec2-user@ip-abc-abc-abc-abc$

aws s3 cp バケットにファイルをアップロード

コマンド aws s3 cp アップロード元 s3://格納先S3バケット名

(EC2またはローカルPC上の)ファイルを、バケットにアップロードしてみます。

まず、格納先のバケット内が空であることを確認。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
ec2-user@ip-abc-abc-abc-abc$

適当な内容でファイルを作成。

ec2-user@ip-abc-abc-abc-abc$ seq 10 > file1.txt
新しいメールが /var/spool/mail/ec2-user にあります
ec2-user@ip-abc-abc-abc-abc$ cat file1.txt
1
2
3
4
5
6
7
8
9
10
ec2-user@ip-abc-abc-abc-abc$

ファイルをバケットへアップロードします。

ec2-user@ip-abc-abc-abc-abc$ aws s3 cp file1.txt s3://takk-bucket-sample-1/
upload: ./file1.txt to s3://takk-bucket-sample-1/file1.txt
ec2-user@ip-abc-abc-abc-abc$

コマンド実行しました。では、バケットの中をみてみます。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
2021-10-10 04:51:13         21 file1.txt
ec2-user@ip-abc-abc-abc-abc$

アップロードしたファイルが確認できました。

次は、複数ファイルをアップロードしてみましょう。

ec2-user@ip-abc-abc-abc-abc$ for i in file2.txt file3.txt;do echo HELLO>$i;aws s3 cp $i s3://takk-bucket-sample-1/;done
upload: ./file2.txt to s3://takk-bucket-sample-1/file2.txt
upload: ./file3.txt to s3://takk-bucket-sample-1/file3.txt
ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
2021-10-10 04:51:13         21 file1.txt
2021-10-10 06:03:40          6 file2.txt
2021-10-10 06:03:41          6 file3.txt
ec2-user@ip-abc-abc-abc-abc$

aws s3 cp バケットからファイルをダウンロード

コマンド aws s3 cp s3://格納先S3バケット名/ファイル名 ダウンロード先

バケットに格納しているファイルをダウンロードします。

ダウンロード先のディレクトリは空状態です。

ec2-user@ip-abc-abc-abc-abc$ ls
ec2-user@ip-abc-abc-abc-abc$

ダウンロード実行します。「.」を指定することでカレントディレクトリをダウンロード先とします。

ec2-user@ip-abc-abc-abc-abc$ aws s3 cp s3://takk-bucket-sample-1/file1.txt .
download: s3://takk-bucket-sample-1/file1.txt to ./file1.txt
ec2-user@ip-abc-abc-abc-abc$ ls
file1.txt
ec2-user@ip-abc-abc-abc-abc$

ダウンロードしたファイルの内容を確認します。

ec2-user@ip-abc-abc-abc-abc$ cat file1.txt
1
2
3
4
5
6
7
8
9
10
ec2-user@ip-abc-abc-abc-abc$

「.」の代わりに、新規ファイル「file1-new.txt」を指定してみます。

ec2-user@ip-abc-abc-abc-abc$ aws s3 cp s3://takk-bucket-sample-1/file1.txt file2.txt
download: s3://takk-bucket-sample-1/file1.txt to ./file1-new.txt
ec2-user@ip-abc-abc-abc-abc$ ls
file1.txt  file1-new.txt
ec2-user@ip-abc-abc-abc-abc$ cat file1-new.txt
1
2
3
4
5
6
7
8
9
10
ec2-user@ip-abc-abc-abc-abc$

aws s3 cp バケットからファイルを複数ダウンロード

バケット上の全ファイルをダウンロードすることはできるでしょうか。
アスタリスク「*」使えるでしょうか。普通に考えると*は、Bashの機能ですから・・・、使えないですよね。

ec2-user@ip-abc-abc-abc-abc$ aws s3 cp s3://takk-bucket-sample-1/* .
fatal error: An error occurred (404) when calling the HeadObject operation: Key "*" does not exist
ec2-user@ip-abc-abc-abc-abc$

ん〜。やっぱり使えないようです。

となると、バケット上の全ファイルをダウンロードするには、lsで一覧を取得するしかなさそうです。

一旦ローカルファイルを削除。

ec2-user@ip-abc-abc-abc-abc$ rm *
ec2-user@ip-abc-abc-abc-abc$
ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
2021-10-10 04:51:13         21 file1.txt
2021-10-10 06:03:40          6 file2.txt
2021-10-10 06:03:41          6 file3.txt
ec2-user@ip-abc-abc-abc-abc$

情報が多すぎるので、awkを使って、ファイル名だけに絞りましょう。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1 | awk '{print $4}'
file1.txt
file2.txt
file3.txt
ec2-user@ip-abc-abc-abc-abc$

これをforコマンドで繰り返しaws s3 cpコマンドを実行すれば、全ファイルダウンロードできます。

ec2-user@ip-abc-abc-abc-abc$ for i in `aws s3 ls s3://$BUCKET_NAME | awk '{print $4}'`;do
> aws s3 cp s3://$BUCKET_NAME/$i .;done
download: s3://takk-bucket-sample-1/file1.txt to ./file1.txt
download: s3://takk-bucket-sample-1/file2.txt to ./file2.txt
download: s3://takk-bucket-sample-1/file3.txt to ./file3.txt
ec2-user@ip-abc-abc-abc-abc$

ダウンロードしたファイルを確認しましょう。

ec2-user@ip-abc-abc-abc-abc$ ls
file1.txt  file2.txt  file3.txt
ec2-user@ip-abc-abc-abc-abc$ head *
==> file1.txt <==
1
2
3
4
5
6
7
8
9
10

==> file2.txt <==
HELLO

==> file3.txt <==
HELLO
ec2-user@ip-abc-abc-abc-abc$

aws s3 rm バケットのファイル削除

コマンド aws s3 rm s3://格納先S3バケット名/ファイル名

S3バケット内のファイルを削除してみます。
ファイル削除を試す前に、現在格納されているファイルを確認します。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
2021-10-10 04:51:13         21 file1.txt
2021-10-10 06:03:40          6 file2.txt
2021-10-10 06:03:41          6 file3.txt
ec2-user@ip-abc-abc-abc-abc$

では、ファイル削除してみましょう。

ec2-user@ip-abc-abc-abc-abc$ aws s3 rm s3://takk-bucket-sample-1/file1.txt
delete: s3://takk-bucket-sample-1/file1.txt
ec2-user@ip-abc-abc-abc-abc$

削除されたでしょうか。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
2021-10-10 06:03:40          6 file2.txt
2021-10-10 06:03:41          6 file3.txt
ec2-user@ip-abc-abc-abc-abc$

file1.txtが削除されました。

ファイルを指定せずに実行するとどうなるでしょうか

ec2-user@ip-abc-abc-abc-abc$ aws s3 rm s3://takk-bucket-sample-1
ec2-user@ip-abc-abc-abc-abc$

あれ、何も返ってきません。aws s3 lsを確認すると、

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
2021-10-10 06:03:40          6 file2.txt
2021-10-10 06:03:41          6 file3.txt
ec2-user@ip-abc-abc-abc-abc$

アスタリスクを指定してみます。使えるでしょうか・・・

ec2-user@ip-abc-abc-abc-abc$ aws s3 rm s3://takk-bucket-sample-1/*
delete: s3://takk-bucket-sample-1/*
ec2-user@ip-abc-abc-abc-abc$

あれ、レスポンスが返ってきました。
削除されたか確認してみます。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
2021-10-10 06:03:40          6 file2.txt
2021-10-10 06:03:41          6 file3.txt
ec2-user@ip-abc-abc-abc-abc$

消えてません。やはり*で全てのファイルは指定できませんね。

全ファイルを削除するには、–recursiveオプションを指定します。

ec2-user@ip-abc-abc-abc-abc$ aws s3 rm s3://takk-bucket-sample-1 --recursive
delete: s3://takk-bucket-sample-1/file2.txt
delete: s3://takk-bucket-sample-1/file3.txt
ec2-user@ip-abc-abc-abc-abc$

削除されたか確認してみましょう。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls s3://takk-bucket-sample-1
ec2-user@ip-abc-abc-abc-abc$

きれいに削除されました。

aws s3 rb バケットの削除

コマンド aws s3 rb s3://S3バケット名

aws s3 rbで、バケットを削除することができます。まずはバケットが存在することを確認。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls
2021-10-10 04:24:01 takk-bucket-sample-1
ec2-user@ip-abc-abc-abc-abc$

バケットを指定してaws s3 rbを使います。

ec2-user@ip-abc-abc-abc-abc$ aws s3 rb s3://takk-bucket-sample-1
remove_bucket: takk-bucket-sample-1
ec2-user@ip-abc-abc-abc-abc$

削除されたか確認します。

ec2-user@ip-abc-abc-abc-abc$ aws s3 ls
ec2-user@ip-abc-abc-abc-abc$

削除されました。

コメント

タイトルとURLをコピーしました