AWS CLI で S3 バケットの操作を行う場合、大きく分けて以下の 2 種類のコマンドがあります。
aws s3
… 高レベルコマンドaws s3api
… API レベルコマンド
基本的には、aws s3
コマンドでカバーできない操作が出てきたときに aws s3api
コマンドの方を調べてみるというやり方でいいと思います。
aws s3
コマンドの方は、OS のコマンドラインシェルのファイル操作コマンドのような体系になっています(aws s3 ls
とか aws s3 rm
とか)。
S3 バケットの操作を行うには、IAM ユーザーに適切な権限が割り当てられている必要がありますが、AmazonS3FulAccess
管理ポリシーがあればほとんどの操作が可能です。
S3 バケットを作成する (s3 mb)
☝️ 同名バケットの再生成でエラー
バケットの削除後に、同名のバケットを再生成しようとすると、次のような conflicting conditional operation のエラーになることがあります。
この場合は、バケットの削除処理が完了するまでしばらく待つ必要があります。
このような待ち時間を防ぐためには、s3 rb
でバケットを削除した後で再生成するのではなく、s3 rm --recursive
でバケット内のオブジェクトだけをすべて削除します。
S3 バケットの作成先リージョンを明示するには、--region
オプションを使用します。
参考: S3 バケットのリージョンを確認する
S3 バケットの一覧、オブジェクトの一覧を表示する (s3 ls)
S3 バケットの一覧を取得
バケットに含まれるオブジェクトの一覧を取得
ディレクトリ名まで指定する場合は、dir/
のように最後のスラッシュが必要です。
これを付けないと、dir
というファイルを探してしまいます。
オブジェクトをコピーする (s3 copy)
s3 copy (cp)
コマンドでは、ローカルファイルのバケットへの転送、バケットからのダウンロード、バケット内でのコピーなどを行うことができます。
ローカル → S3 バケット
S3 バケットの方にも data ディレクトリを作りたければ、ターゲットを明示的に s3://my-bucket/data
とする必要があります。
更新されたファイルだけを効率的にアップロードしたいときは、s3 sync コマンドを使ってください。
S3 バケット → ローカル
S3 バケット → S3 バケット
ディレクトリの内容を同期する (s3 sync)
s3 sync
コマンドは、2 回目以降の実行では更新されたファイルのみを転送します。
似たようなコマンドに s3 cp --recursive
がありますが、すでに存在するファイルもすべて転送してしまうので効率が悪いです。
--delete
オプションを付けると、同期元に存在しないファイルを同期先から削除します。
注意点としては、深い階層にあるファイルにマッチさせるためには、*hello.txt
のように先頭に *
を付ける必要があるというところです。
つまり、ほとんどのケースでは *
プレフィックスを付ける必要があります。
あと、*/hello.txt
のようなスラッシュ付きのプレフィックスを付けてしまうと、最上位にあるファイルにマッチしなくなってしまうようです。
ちょっと使いにくいコマンド仕様ですね。。。
オブジェクトを削除する (s3 rm)
バケットのバージョニングが有効になっている場合は、バケットの中身を空にすることはできません。
バケットを削除する
バージョニング設定が無効であれば、下記のコマンドでバケットを削除することができます。
ただし、空ではないバケット(オブジェクトを含むバケット)を削除しようとすると、BucketNotEmpty
というエラーが発生します。
含まれているオブジェクトもすべて削除してしまってよい場合は、バケット削除時に --force
オプションを使用します。
S3 Glacier ストレージクラスに移行済みのオブジェクトも含めて、オブジェクトがすべて削除されます。
バケットのタグ関連の操作
バケットのタグを取得する (s3api get-bucket-tagging)
バケットにタグを設定する (s3api put-bucket-tagging)
次の例では、2 つのタグを S3 バケットにセットしています。
既存のタグは上書きされてしまうことに注意してください。
JSON ファイルでタグの内容を記述しておいて、それを --tagging
オプションで渡すこともできます。
バケットのバージョニング (s3api put-bucket-versioning)
バケットのバージョニングを有効にすると、S3 バケットに同名のキーでファイルをアップロードしたときに、過去のバージョンが残るようになります。
具体的には、バージョニング有効時にファイルをアップロードすると、そのオブジェクトに一意の バージョン ID が割り当てられて、過去のファイルと区別できるようになります。
バージョニング無効時にアップロードされたファイルのバージョン ID は null になります。
キー | バージョン ID | 説明 |
---|
hello.txt | 8PqtjVIxmjtn_aJ3aVxAJHVxOWNdWlXk | 3 回目のアップロード(バージョニング有効時) |
hello.txt | 2vE4HOEHRPPd5hSqAazAHQczmQnmmlQ7 | 2 回目のアップロード(バージョニング有効時) |
hello.txt | null | 1 回目のアップロード(バージョニング無効時) |
バージョニングを無効に切り替えても、バージョニング有効時にアップロードしたファイル群が消えることはありません。
新しくアップロードされるファイルのバージョン ID が null になるだけです。
このとき、バージョン ID が null のオブジェクトが既に存在する場合は上書きされます(過去にバージョニング無効時にアップロードしたものがある場合)。
各バージョンのファイルは、S3 のマネージメントコンソールから個別に削除することができます。
バケットのリージョンを確認する (s3api get-bucket-location)
S3 バケットがどのリージョンに作成されているかを調べるには以下のようにします。
このコマンドでは、バケット名に s3://
プレフィックスは付けてはいけないことに注意してください。
バケット名やバケットの ARN を指定します。
出力のフォーマットは、設定によって JSON 形式だったり YAML 形式だったりします。
上記の例は、YAML 形式です。
関連記事