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でも可能です。
Contents
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$
コメント