omuronの備忘録

個人的な備忘録

「JAWS-UG CLI専門支部 #169R S3基礎 バージョニング」受講 #jawsug_cli

jawsug-cli.connpass.com

本番では監査以外ではあまり使うわ無いほうがいいかも?
という S3 のバージョン管理についてです。

S3 バージョニング概要

バージョニングはバケットに対して行う。
影響はオブジェクトにでる。

  • バージョニングを利用する機能
    • リテンションモード (object-retention)
    • オブジェクトロック (object-lock)
    • リーガルホールド (object-legal-hold)

バージョン設定

バージョン設定を有効にする。

aws s3api put-bucket-versioning \
  --bucket ${S3_BUCKET_NAME} \
  --versioning-configuration Status=Enabled

バージョン設定をすることで、サフィックスにバージョンIDが付与される。

バージョン設定前

s3://my-bucket/1/sample.txt
# s3://バケット/プレフィックス/キー

バージョン設定後

バージョン有効にするとサフィックスに32桁の英数字が付く

s3://my-bucket/1/sample.txtSnHXUuQ.A1uQpXzSO4Nm5EcBjTqB1A4D
# s3://バケット/プレフィックス/キー バージョンID(32桁英数)

バージョンID が違うのが増えていく。
Git の様に差分管理されるわけじゃないので、容量もそのまま増えていくので注意。

オブジェクト削除

特定バージョン消しても問題は無い。

aws s3api delete-object \
  --bucket ${S3_BUCKET_NAME} \
  --key ${S3_OBJECT_KEY} \
  --version-id ${S3_OBJECT_VERSION_ID}

f:id:omron:20201008204812p:plain

削除した後、S3 にてバージョン「表示」にして確認すると、削除したオブジェクトには削除マーカーが付いている。

バケットの見た目は空でも、バージョニングしたファイルが残っているので注意する。
(強制バケット削除しない限り、バケット削除ができなくなったりする)

f:id:omron:20201008205009p:plain

試してみる

1というファイル、内容も 1 だけをアップロード。

$ cat 1
1
$ aws s3 cp 1 s3://${S3_BUCKET_NAME}/1
upload: ./1 to s3://my-bucket/1  

内容を 23 に変えて再アップロード。

$ cat << EOF > 1
> 2
> EOF
$ aws s3 cp 1 s3://${S3_BUCKET_NAME}/1
upload: ./1 to s3://my-bucket/1  
$ cat << EOF > 1
> 3
> EOF
$ aws s3 cp 1 s3://${S3_BUCKET_NAME}/1
upload: ./1 to s3://my-bucket/1  

これで3つバージョンができる。

f:id:omron:20201008210307p:plain

バージョン ID を確認して...

$ aws s3api list-object-versions --output json --bucket ${S3_BUCKET_NAME} 

2 にあたるファイルを指定して落とすとちゃんと取れた。

$ aws s3api get-object   --bucket ${S3_BUCKET_NAME}   --key 1 download-2 --version-id PQ59qkW.rnPcRxU1YRWHGMQk1n2N.v6V
{
    "AcceptRanges": "bytes",
    "LastModified": "2020-10-08T11:55:53+00:00",
    "ContentLength": 2,
    "ETag": "\"26ab0db90d72e28ad0ba1e22ee510510\"",
    "VersionId": "PQ59qkW.rnPcRxU1YRWHGMQk1n2N.v6V",
    "ContentType": "binary/octet-stream",
    "Metadata": {}
}
$ cat download-2 
2

s3 rm で削除すると...

$ aws s3 rm s3://${S3_BUCKET_NAME}/1
delete: s3://my-bucket/1

マネジメントコンソールで消えた状態。

f:id:omron:20201008211419p:plain

バージョン表示で確認すると、削除マーカーが付いて残っている。

f:id:omron:20201008211058p:plain

削除マーカーが付いて無いものは、どれでもバージョン ID 指定して、落とすことはできる。

$ aws s3api get-object   --bucket ${S3_BUCKET_NAME}   --key 1 download-3 --version-id 382Ib1r7RuyDON.JMqlkUBiGSfFR4fT9
{
    "AcceptRanges": "bytes",
    "LastModified": "2020-10-08T11:57:44+00:00",
    "ContentLength": 2,
    "ETag": "\"6d7fce9fee471194aa8b5b6e47267f03\"",
    "VersionId": "382Ib1r7RuyDON.JMqlkUBiGSfFR4fT9",
    "ContentType": "binary/octet-stream",
    "Metadata": {}
}
$ cat download-3
3

所感

テキストとかであれば Gitとかの VSS でバージョン管理をするべきで、S3 のバージョン管理はテキストじゃないオブジェクトファイルとかなら使いみちもあるのかなと思いました。
ファイル名+日付管理を撲滅したり、タイムマシーン的にも使ったりもできそう。
ただ、差分管理じゃないからお金には注意ですね。

追記

S3 バージョニングは CRR に必要

との声が聞こえた気がしたので、調べると。

docs.aws.amazon.com

レプリケート元とレプリケート先の両方のバケットで、バージョニングを有効にする必要があります。

なるほどなるほど。
Cross Region Replication の略ということすらわからなかったけど、「CRR するときにはバージョニング設定いる」ということだけ覚えておこう。