CFNでバージョニングを有効化したS3バケットを作成する

CloudFormationでバージョニングを有効化したS3バケットを作成する

CloudFormationを使用して、バージョニングを有効化したS3バケットを作成する

S3が提供する機能の1つに、バージョニングがあります。

Amazon S3 のバージョニングとは、同じバケット内でオブジェクトの複数のバリアントを保持する手段のことです。S3 のバージョニング機能を使用すると、バケットに保存されたすべてのオブジェクトのすべてのバージョンを、保存、取得、復元することができます。

S3 バケットでのバージョニングの使用

今回はCloudFormationを使用して、バージョニングを有効化したS3バケットを作成します。

構築する環境

Diagram of create S3 bucket with versioning enabled by CloudFormation

S3バケットを作成します。

バケットのバージョニング機能を有効化します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/109

テンプレートファイルのポイント解説

S3バケット

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: Private
      BucketName: !Ref Prefix
      VersioningConfiguration:
        Status: Enabled
Code language: YAML (yaml)

バージョニングはVersioningConfigurationプロパティで設定します。

内部のStatusプロパティを「Enabled」とすることで、バージョニングが有効化されます。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • S3バケット:fa-109

AWS Management Consoleから各リソースを確認します。

S3バケットを確認します。

Detail of S3 1.

確かにバージョニングが有効化されています。

動作確認

オブジェクト配置

準備が整いましたので、このバケットにオブジェクトを配置します。
AWS CLIを使用して、テストファイルを配置します。

$ echo 'hogehoge' > sample.txt

$ aws s3 cp sample.txt s3://fa-109/
upload: ./sample.txt to s3://fa-109/sample.txt
Code language: Bash (bash)

S3バケットの状況を確認します。

Detail of S3 2.

確かにバケットにテストファイルが配置されています。

このオブジェクトのバージョニング情報を確認します。

Detail of S3 3.

バージョン情報が表示されました。
バケットに配置したばかりのオブジェクトですので、現在の状況が最新のバージョンということになります。

オブジェクト更新

続いてオブジェクトを更新した際の挙動を確認します。
改めてAWS CLIからオブジェクトを更新します。

$ echo 'fugafuga' >> sample.txt

$ aws s3 cp sample.txt s3://fa-109/
upload: ./sample.txt to s3://fa-109/sample.txt
Code language: Bash (bash)

改めてS3バケットの状況を確認します。

Detail of S3 4.

オブジェクトが更新されたため、バージョンが更新されました。
このように最新バージョンはもちろんですが、古いバージョンのオブジェクトもダウンロードすることができます。

このようにマネージメントコンソールからダウンロードすることもできますが、AWS CLIからも古いバージョンのオブジェクトをダウンロードすることができます。

手順としては、以下となります。

  • オブジェクトのバージョン一覧からバージョンIDを確認する
  • バージョンIDを指定してオブジェクトを取得する

実際にやってみます。

まずオブジェクトのバージョン一覧を確認します。

$ aws s3api list-object-versions \
--bucket fa-109 \
--prefix sample.txt
{
    "Versions": [
        {
            "ETag": "\"304693ccbc28bbeac4689b24bda76e0e\"",
            "Size": 18,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "pihuAbcKaZeTLRXpUXecgeT0NihYkpnM",
            "IsLatest": true,
            "LastModified": "2022-12-27T22:43:18+00:00",
            "Owner": {
                "DisplayName": "[owner-name]",
                "ID": "[owner-id]"
            }
        },
        {
            "ETag": "\"d9a3fdfc7ca17c47ed007bed5d2eb873\"",
            "Size": 9,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "i6yvYFzBM45jJHa1yyosvPxtw2Kyrozf",
            "IsLatest": false,
            "LastModified": "2022-12-27T22:32:22+00:00",
            "Owner": {
                "DisplayName": "[owner-name]",
                "ID": "[owner-id]"
            }
        }
    ]
}
Code language: Bash (bash)

1つ目が最新バージョンです。
これはIsLatestの値から判断できます。

2つ目が古いバージョンです。
VersionIdの値が「pihuAbcKaZeTLRXpUXecgeT0NihYkpnM」とありますので、これが古いバージョンのバージョンIDです。

バージョンIDがわかりましたので、古いバージョンのオブジェクトを取得します。

$ aws s3api get-object \
--bucket fa-109 \
--key sample.txt \
--version-id i6yvYFzBM45jJHa1yyosvPxtw2Kyrozf \
sample_old.txt
{
    "AcceptRanges": "bytes",
    "LastModified": "2022-12-27T22:32:22+00:00",
    "ContentLength": 9,
    "ETag": "\"d9a3fdfc7ca17c47ed007bed5d2eb873\"",
    "VersionId": "i6yvYFzBM45jJHa1yyosvPxtw2Kyrozf",
    "ContentType": "text/plain",
    "Metadata": {}
}

$ cat sample_old.txt
hogehoge
Code language: Bash (bash)

オブジェクトがダウンロードできました。
確かに内容が更新する前のものです。

まとめ

CloudFormationを使用して、バージョニングを有効化したS3バケットを作成する方法と、古いバージョンのオブジェクトを取得する方法を確認しました。