S3ライフサイクル

表題の件でゴミを削除することにした。

■ 環境

  • AWS S3

■ ライフサイクル

ライフサイクルでは、一定期間経過後、オブジェクトをGlacierに移動させたりすることができる。今回は該当バケット内に作成された全てのオブジェクトを対象に、作成されて1週間以上経過後のオブジェクトを破棄するようにした。Management Consoleから設定を行ってみる。

該当のバケットを表示後、上部の”管理“より”ライフサイクルルールの追加“を実施する。

ルール名は自身が判別つくわかりやすいもので構わない。フィルターは今回は使用していないが、該当のprefix配下のオブジェクトのみが対象である場合にはここで指定する。

今回はGlacierへの移行ではないのでここはスキップする。

現行バージョン“のみチェックしている。これは該当のバケットではバージョン設定を使用していないからである。”オブジェクトの現行バージョンを失効する“にチェックを入れ、日数は”7“としている。”不完全なマルチパートアップロードをクリーンアップする“も一応チェックを入れておいた。日数はデフォルトままの”7“である。

最後は内容を確認し保存して完了である。

実行されるタイミングはよくわからないが、新たなオブジェクトを追加したタイミングとかであろうか。まぁ自身にとっては不要なファイルを削除してほしいだけなので実行されるタイミングはなんであろうと問題ない。

以上。

特定prefix配下のオブジェクトを全て削除

AWS S3において表題の件を`aws`コマンドで行いたい。

■ 環境

  • awscli 1.14.50
  • Mac OSX El Capitan

■ aws s3 rm

不要なオブジェクトが大量にある。件数を出してみると50万個…。どれもS3のライフサイクルを設定される前に作成されたもので既に不要になったものの残ってしまっていたオブジェクトである。さすがに50万個もあるので1個ずつ消していくとかなりの時間がかかってしまう。というわけである程度prefixで対象をまとめることができそうだったので、特定のprefix配下にあるオブジェクト全てを削除したい。

$ aws s3 rm s3://..../path/to/ --recursive

–recursive“を付けることで、指定したprefix配下全てを削除してくれる。

prefixを絞ってみたところ、対象が50万個であったオブジェクトが1万5千prefix程度になった。これでも十分多いのであるがさすがに50万個に比べれば我慢できる範囲である。後は1行スクリプトでどんどん消していくだけである。

以上。

S3デフォルト暗号化

表題について。

■ 環境

  • AWS S3
  • awscli 1.11.190
  • Mac OSX El Capitan

■ デフォルト暗号化

S3上でデフォルト暗号化がされるようにバケットの設定をすることができる。2017/11頃からであったと記憶している。ManagementConsoleから下記で変更することが可能である。

バケット > プロパティ > デフォルト暗号化

とりあえず”AES-256“を選択した。

`aws`コマンドでオブジェクトをput/getしても特に何もしなくても問題無い。

このManagementConsoleで”デフォルト暗号化”を設定するが、awscliでできるのか?を見てみた。

■ s3

$ aws s3 mb help

マニュアルを見ても、特にオプションと思わしきものはない。”region“を指定することができるくらいのようである。

■ s3api

$ aws s3api create-bucket help

上記では”–create-bucket-configuration“オプションがあるので指定できるのかと思ったのだが、”LocationConstraint“しか指定できないように読める…。その他は権限周りのオプションのようだ。

デフォルト暗号化の設定は後からでも変更できるな、と思い他のサブコマンドも確認してみる。

get-bucket-encryption

$ aws s3api get-bucket-encryption --bucket withsin
{
    "ServerSideEncryptionConfiguration": {
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "AES256"
                }
            }
        ]
    }
}
$

暗号化しているか?は”get-bucket-encryption“サブコマンドで取得できる。ちなみにデフォルト暗号化をしていないバケットに対して同様のコマンドを実行すると下記のようになるようだ。

$ aws s3api get-bucket-encryption --bucket withsin2

An error occurred (ServerSideEncryptionConfigurationNotFoundError) when calling the GetBucketEncryption operation: The server side encryption configuration was not found
$

put-bucket-encryption

$ aws s3api put-bucket-encryption help

どうやらこのサブコマンドで設定することが可能なようである。試してみよう。

$ aws s3api put-bucket-encryption --bucket withsin2 --server-side-encryption-configuration '{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      }
    }
  ]
}'
$
$ aws s3api get-bucket-encryption --bucket withsin2
{
    "ServerSideEncryptionConfiguration": {
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "AES256"
                }
            }
        ]
    }
}
$

上記のように設定ができたようである。

以上。

aws s3 ls bucket

知らなかったので表題をメモ。

■ 環境

  • awscli 1.11.113
  • Mac OSX El Capitan

■ aws s3 ls

いつもは下記のようにやっていた。

$ aws s3 ls s3://withsin/
                           PRE project1/
                           PRE project2/
$

何の気なしに下記のようにやっても同じ結果が得られた。

$ aws s3 ls withsin
                           PRE project1/
                           PRE project2/
$

s3://“のスキームはなくても良いらしい。知らなかった。

以上。

S3の特定のパス配下のファイル総容量

表題の通り。awscliで、S3のあるパス配下にあるすべてのファイルの総容量を知りたい。

■ 環境

  • awk
  • awscli 1.11.47

■ s3

下記コマンドで取得することができる。

$ aws s3 ls s3://[bucket]/[path] --recursive | awk 'BEGIN {sum=0} {sum+=$3} END {print sum}'

肝となるところは”–recursive“で配下全てのファイルについて`ls`で詳細を取得しているところであろうか。`ls`の表記の中からファイル容量が3つ目の項目に表示されているので、この3つ目の項目を`awk`で総和計算している。

試しに自身のとある環境で行ってみたところ、下記のような結果を得られた。

$ aws s3 ls s3://[bucket]/[path] --recursive | awk 'BEGIN {sum=0} {sum+=$3} END {print sum}'
373689
$

表示はByteなので、`awk`の最後で`/1024`としていけば”KByte“や”MByte“で取得することも可能である。

以上。