(AWS CLI)S3を使う

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

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

ec2-user@xxxxx$ 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@xxxxx$

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

スポンサーリンク

S3バケット操作

aws s3 mb バケットの作成

aws s3 mb helpより

SYNOPSIS
            mb
          <S3Uri>

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

〜省略〜
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@xxxxx$ aws s3 ls
ec2-user@xxxxx$

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

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

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

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

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

aws s3 rb バケットの削除

aws s3 rb helpより

SYNOPSIS
            rb
          <S3Uri>
          [--force]

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

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

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

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

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

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

ec2-user@xxxxx$ aws s3 ls
ec2-user@xxxxx$

削除されました。

一覧表示

aws s3 ls helpより

SYNOPSIS
            ls
          <S3Uri> or NONE
          [--recursive]
          [--page-size <value>]
          [--human-readable]
          [--summarize]
          [--request-payer <value>]

aws s3 ls バケット一覧

パラメータなしでlsを実行すると、バケットの一覧が表示されます。

コマンド aws s3 ls

ec2-user@xxxxx$ aws s3 ls
2022-01-04 14:04:37 takk-bucket-sample-1
2022-01-04 14:04:43 takk-bucket-sample-2
ec2-user@xxxxx$

aws s3 ls ファイル一覧

lsのパラメータにバケット名を指定すると、バケット内のファイルが一覧表示されます。

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

ec2-user@xxxxx$ aws s3 ls s3://takk-bucket-sample-1
2022-01-04 14:09:07          6 file1.txt
2022-01-04 14:09:15          6 file2.txt
ec2-user@xxxxx$

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

SYNOPSIS
            rm
          <S3Uri>
          [--dryrun]
          [--quiet]
          [--recursive]
          [--request-payer <value>]
          [--include <value>]
          [--exclude <value>]
          [--only-show-errors]
          [--page-size <value>]

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

ec2-user@xxxxx$ 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@xxxxx$

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

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

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

削除されたでしょうか。

ec2-user@xxxxx$ 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@xxxxx$

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

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

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

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

ec2-user@xxxxx$ 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@xxxxx$

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

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

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

ec2-user@xxxxx$ 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@xxxxx$

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

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

ec2-user@xxxxx$ 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@xxxxx$

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

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

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

ファイルのアップロード・ダウンロード

aws s3 cp helpより

SYNOPSIS
            cp
          <LocalPath> <S3Uri> or <S3Uri> <LocalPath> or <S3Uri> <S3Uri>
          [--dryrun]
          [--quiet]
          [--include <value>]
          [--exclude <value>]
          [--acl <value>]
          [--follow-symlinks | --no-follow-symlinks]
          [--no-guess-mime-type]
          [--sse <value>]
          [--sse-c <value>]
          [--sse-c-key <value>]
          [--sse-kms-key-id <value>]
          [--sse-c-copy-source <value>]
          [--sse-c-copy-source-key <value>]
          [--storage-class <value>]
          [--grants <value> [<value>...]]
          [--website-redirect <value>]
          [--content-type <value>]
          [--cache-control <value>]
          [--content-disposition <value>]
          [--content-encoding <value>]
          [--content-language <value>]
          [--expires <value>]
          [--source-region <value>]
          [--only-show-errors]
          [--no-progress]
          [--page-size <value>]
          [--ignore-glacier-warnings]
          [--force-glacier-transfer]
          [--request-payer <value>]
          [--metadata <value>]
          [--copy-props <value>]
          [--metadata-directive <value>]
          [--expected-size <value>]
          [--recursive]

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


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

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

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

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

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

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

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

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

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

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

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

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

ec2-user@xxxxx$ 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@xxxxx$ 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@xxxxx$

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


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

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

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

ec2-user@xxxxx$ ls
ec2-user@xxxxx$

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

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

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

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

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

ec2-user@xxxxx$ 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@xxxxx$ ls
file1.txt  file1-new.txt
ec2-user@xxxxx$ cat file1-new.txt
1
2
3
4
5
6
7
8
9
10
ec2-user@xxxxx$

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

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

ec2-user@xxxxx$ 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@xxxxx$

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

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

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

ec2-user@xxxxx$ rm *
ec2-user@xxxxx$
ec2-user@xxxxx$ 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@xxxxx$

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

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

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

ec2-user@xxxxx$ 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@xxxxx$

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

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

==> file2.txt <==
HELLO

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

コメント

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