S3 でのサブディレクトリのオブジェクトのこととプロパティの確認
AWS S3、バケットのサブディレクトリは単にプレフィクスの文字列であって、ファイル名がそれっぽく区切り文字「/」で続いてるだけです、S3 にサブディレクトリという概念はない。です。
ですが、時々サブディレクトリ自体のオブジェクト、「/」で終わる名前のものとして存在することがある、そして AWS S3 コンソールでは確認できない。勿論コンソールで疑似ディレクトリは表示されているが、オブジェクトしての最終更新日時とかは表示されない。というか、疑似ディレクトリがフォルダとして表示されてるだけで、「/」で終わる名前のオブジェクト自体はコンソールで表示されてない模様。
サブディレクトリ自体のオブジェクト「/」で終わる名前のものを確認したい、最終更新日時とかメタデータとか、プロパティを見たい。
コンソールでの確認は出来なくて(Cyberduck では見えるのだとか)、CLI なら確認できた、それは「aws s3」コマンドではなくて、「aws s3api」コマンドでした。
「aws s3api list-objects」で探索し、「 aws s3api head-object」で確認する。
…@ip-172-30-0-105[35433] aws s3api list-objects --bucket <どっか> --prefix instagram --output json --query "Contents[?ends_with(Key,'es/')]" [ { "LastModified": "2024-06-24T20:43:39.000Z", "ETag": "\"<何だかな>\"", "StorageClass": "STANDARD", "Key": "instagram/upload_files/", "Owner": { "DisplayName": "aws-admin", "ID": "<何だっけ長いです>" }, "Size": 0 } ] [~/…] <pts/14>
クエリーは、終わりの「/」だけの探索でもいいのだけど、ここではもう少し探すものがわかってるので最後の数文字を書いた。
…@ip-172-30-0-105[35434] aws s3api head-object --bucket <どっか> --key 'instagram/upload_files/' --output json { "AcceptRanges": "bytes", "ContentType": "application/x-directory", "LastModified": "Mon, 24 Jun 2024 20:43:39 GMT", "ContentLength": 0, "ETag": "\"<何だかな>\"", "Expiration": "expiry-date=\"Thu, 25 Jul 2024 00:00:00 GMT\", rule-id=\"DeleteAfter30\"", "ServerSideEncryption": "AES256", "Metadata": { "uid": "1000", "gid": "1000", "mode": "16895", "mtime": "0", "atime": "0", "ctime": "1719261818.112921171" } } [~…]
サブディレクトリのプレフィクスが instagram なのは SNS のいろいろを整理してるところだからです。
出力形式、いつもは(デフォルトに設定してるのは)「--output text」なんだけど、ここでは json形式の方が見やすいのでそうしてみました。
「expiry-date=」の記述があるのは今回の経緯によるもので普通はなかったり、「Metadata」も。
経緯
- S3 バケットのサブディレクトリ(プレフィクス)を、EC2 の Linuxで s3-fs でマウント、そこにさらにサブディレクトリ(上記「upload_files」)切って権限調整していろいろファイルを溜めてく
- ファイルが増えてきたので古いの整理しましょう、S3バケットでライフタイムルールの設定、30日
- しばらくしたら(30日)そのディレクトリの権限が変わって(調整がなくなって偉い人だけになる)、今までやってたファイル操作ができなくなる
- サブディレクトリの権限調整再び、それでファイル操作は出来るようになったけど、しばらくしてまた起こるんじゃやだな
- 調査
ということで、事情が分かった。
サブディレクトリの実体のオブジェクトがあり、そこで所要の権限調整を覚えているが、S3のオブジェクトなのでバケット設定のライフサイクルルールが適用され、時期がくるとなくってしまい、権限調整が白紙になる。
「aws s3api」コマンドで状況が確認できたけど、対策ではなかった。
S3バケットのライフサイクルルール をやめて、EC2 の Linux側で cron で古いファイルを削除するようにしましょう。crontab 頑張ります。