未解決
1 Rookie
•
35 メッセージ
1
765
2021年9月15日 17:00
ECS解説第12回 新機能 S3 Object Lock のサポートについて(前編)
皆さん、こんにちは。
前回のCommunity Editionの最新版 V3.6.2.0のご紹介に続いて、今回はそのV3.6.2.0で新たにサポートされた新機能のS3 Object Lockについてご紹介します。
S3 Object LockはAmazon S3で2018年に紹介されたS3に書き込まれたオブジェクトに適用されるWORM(Write Once, Read Many)機能、つまり指定された期間に対象のオブジェクトの削除や上書き等を行わせないようにする改ざん防止機能になります。
改ざん防止でオブジェクトを保護する指定期間を、次の二つのモードで指定することができます。
- ガバナンスモード:対象のバージョンのオブジェクトを削除・変更から保護
- s3:PutObjectRetention パーミッションによりリテンション期間を増やすことができる
- s3:BypassGovernanceRetention パーミッションによりリテンション期間を短縮・削除することができる。また対象のオブジェクトを削除できる
- コンプライアンスモード:対象のバージョンのオブジェクトを削除・変更から保護
- s3:PutObjectRetention パーミッションによりリテンション期間を増やすことができる
- リテンション期間の短縮・削除はできない
ガバナンスモードは、権限を持つユーザー(IAM Bucketを作成したIAMユーザーや権限を付与されたユーザー)であればリテンション期間を短縮することもできます。
コンプライアンスモードはガバナンスモードと異なり、どのようなユーザーも一度指定した改ざん防止の期間を短縮することができません。仮に期間を無限と指定するとECS本体を廃止するまでデータを削除できなくなります。
また、S3 Object Lockには二つの機能があります。
- リテンション期間:指定期間はWORMでのアクセスのみが許される
- Legal Hold:リテンション期間とは独立し、WORMを指定でき、Legal Holdを削除するまで対象のバージョンのオブジェクトを保護する
- Legal Hold 権限: ON/Off
- S3:PutObjectLegalHold と s3:GetObjectLegalHodl の両パーミッションが必要
機能のさらなる詳細や制限については次回にまとめることとし、この辺でObject Lockの設定と動作を確認してみましょう。今回はリテンション期間の設定による動作を見てみます。Object Lockを利用するにはIAMユーザーである必要があります。
前回、ご案内したECS V3.6.2 Community EditionにIAMユーザーを作成しました。
アクセスポリシーを付与。S3FullAccessを設定し、IAM関連のポリシーは付与しませんでした。このユーザーでアクセスキーとシークレットアクセスキーを払い出し、今回はAWS CLIを使用して、S3互換のAPIでS3 Object Lockをオペレーションしてみます。手元のWindows PCのコンソールにてAWS Configureを実行し、払い出したアクセスキーとシークレットアクセスキーをセットし、Object Lockをイネーブルにしたバケットを作成します。
>aws s3api create-bucket --bucket bucketobjlck1 --object-lock-enabled-for-bucket --endpoint-url http://10.119.81.91:9020
{
"Location": "/bucketobjlck1"
}
>aws s3api get-object-lock-configuration --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"ObjectLockConfiguration": {
"ObjectLockEnabled": "Enabled"
}
}
オプション –object-lock-enabled-for-bucketはバケットの作成時にセットする必要があります。既存のバケットには指定できませんでした。このコマンドで、このバケット、bucketobjlck1はVersioningもイネーブルになっていました。
>aws s3api get-object-lock-configuration --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"ObjectLockConfiguration": {
"ObjectLockEnabled": "Enabled"
}
}
このバケットにリテンションのデフォルト設定を指定してみました。
>aws s3api put-object-lock-configuration --object-lock-configuration "ObjectLockEnabled"="Enabled","Rule"={"DefaultRetention"={"Mode"="COMPLIANCE","Days"="1"}} --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
>aws s3api get-object-lock-configuration --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"ObjectLockConfiguration": {
"ObjectLockEnabled": "Enabled",
"Rule": {
"DefaultRetention": {
"Mode": "COMPLIANCE",
"Days": 1
}
}
}
}
コンプライアンスモードで、書き込まれたオブジェクトは書き込まれてから1日の間、改ざん防止対象になります。このバケットにオブジェクトを書きこんでみます。
(下記コマンドはbody(データ)の指定がないので空ファイルが作成されています)
>aws s3api put-object --key=testdata.txt --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"VersionId": "1631085066464"
}
作成されたオブジェクトのリテンション情報を出力しました(この一連の作業は9/8 午後4時過ぎに実施しました)。
>aws s3api get-object-retention --key=testdata.txt --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"Retention": {
"Mode": "COMPLIANCE",
"RetainUntilDate": "2021-09-09T07:11:09.245000+00:00"
}
}
ここで、お約束(?)のオブジェクトの削除を試みます。ここでは、オブジェクトそのものを指定するためVersion-IDも指定しています。
>aws s3api delete-object --key testdata.txt --version-id "1631085066464" --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
エラーメッセージが出力され、削除コマンドが拒否されたことがわかります。
それでは、Version IDを指定しなかった場合はどうなるでしょうか。Versioningが有効なバケットのため、何等かVersioningが働いてくれることが期待されます。
>aws s3api delete-object --key testdata.txt --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"DeleteMarker": true,
"VersionId": "1631086460627"
}
削除操作が行われたことを示すDelete Markの付与が行われました。
>aws s3api list-objects --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
有効なオブジェクト(Latest: True)がバケット内にないので、リストに出力されませんでした。
Versioningが有効なので、削除された(Deleted Markが付与された)オブジェクトも出力させてみます。
>aws s3api list-object-versions --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"Versions": [
{
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"Size": 0,
"StorageClass": "STANDARD",
"Key": "testdata.txt",
"VersionId": "1631085066464",
"IsLatest": false,
"LastModified": "2021-09-08T07:11:06.464000+00:00",
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:root",
"ID": "urn:ecs:iam::ns1:root"
}
}
],
"DeleteMarkers": [
{
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:user/iamuser1",
"ID": "urn:ecs:iam::ns1:user/iamuser1"
},
"Key": "testdata.txt",
"VersionId": "1631086460627",
"IsLatest": true,
"LastModified": "2021-09-08T07:34:20.627000+00:00"
}
]
}
Version IDがあるので、新たに同じ名前(キー)のオブジェクトが書き込まれても、同じように書き込みを許しますが、Version IDがユニークなため、独立して保護され続けるということです。
この場合、最新のオブジェクトという意味で、最後に書き込まれた(Deleted Markのない)オブジェクトが単なるオブジェクトをリスティングするとリストに出力されます。
新たに(と言っても、先ほど削除した同じ)ファイルを再度アップロードします。バケットはObject Lockが設定されているバケットをそのまま使用します。
>aws s3api put-object --key testdata.txt --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"VersionId": "1631101748380"
}
リテンション情報を表示し、デフォルト(書き込み日+1日)が設定されていることを確認しました。
>aws s3api get-object-retention --key testdata.txt --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"Retention": {
"Mode": "COMPLIANCE",
"RetainUntilDate": "2021-09-09T11:49:08.395000+00:00"
}
}
この状態にRetention Dateの延長を行いました。Retention ModeはComplianceなので、延長は可能。ざっくり2日伸ばしました。
>aws s3api put-object-retention --key testdata.txt --retention Mode="COMPLIANCE",RetainUntilDate="2021-09-11T12:00:00.000z" --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
設定の結果は以下のようになりました。
>aws s3api get-object-retention --key testdata.txt --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"Retention": {
"Mode": "COMPLIANCE",
"RetainUntilDate": "2021-09-11T12:00:00+00:00"
}
}
24時間後、Objectを追記し、リストをすると複数のオブジェクトがリストされます。
>aws s3api list-object-versions --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"Versions": [
{
"ETag": "\"f760df73b7a3ea5d37e703c8e68f829f\"",
"Size": 30,
"StorageClass": "STANDARD",
"Key": "testdata.txt",
"VersionId": "1631175946554",
"IsLatest": true,
"LastModified": "2021-09-09T08:25:46.554000+00:00",
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:root",
"ID": "urn:ecs:iam::ns1:root"
}
},
{
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"Size": 0,
"StorageClass": "STANDARD",
"Key": "testdata.txt",
"VersionId": "1631101748380",
"IsLatest": false,
"LastModified": "2021-09-08T11:49:08.380000+00:00",
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:root",
"ID": "urn:ecs:iam::ns1:root"
}
},
{
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"Size": 0,
"StorageClass": "STANDARD",
"Key": "testdata.txt",
"VersionId": "1631085066464",
"IsLatest": false,
"LastModified": "2021-09-08T07:11:06.464000+00:00",
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:root",
"ID": "urn:ecs:iam::ns1:root"
}
}
],
"DeleteMarkers": [
{
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:user/iamuser1",
"ID": "urn:ecs:iam::ns1:user/iamuser1"
},
"Key": "testdata.txt",
"VersionId": "1631086460627",
"IsLatest": false,
"LastModified": "2021-09-08T07:34:20.627000+00:00"
}
]
}
Version IDの異なるオブジェクトが追加されたことが確認できました。言い換えれば、明示的にDeleted Markerが付与された削除されたオブジェクトは、Retention期間を経過したのちに、Version IDを指定して削除が必要になります。ここで24時間経過したオブジェクトを削除します。
>aws s3api delete-object --key testdata.txt --version-id 1631086460627 --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"DeleteMarker": true,
"VersionId": "1631086460627"
}
バケット内のオブジェクトのバージョン一覧を出力します。
>aws s3api list-object-versions --bucket bucketobjlck1 --endpoint-url http://10.119.81.91:9020
{
"Versions": [
{
"ETag": "\"f760df73b7a3ea5d37e703c8e68f829f\"",
"Size": 30,
"StorageClass": "STANDARD",
"Key": "testdata.txt",
"VersionId": "1631175946554",
"IsLatest": true,
"LastModified": "2021-09-09T08:25:46.554000+00:00",
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:root",
"ID": "urn:ecs:iam::ns1:root"
}
},
{
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"Size": 0,
"StorageClass": "STANDARD",
"Key": "testdata.txt",
"VersionId": "1631101748380",
"IsLatest": false,
"LastModified": "2021-09-08T11:49:08.380000+00:00",
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:root",
"ID": "urn:ecs:iam::ns1:root"
}
},
{
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"Size": 0,
"StorageClass": "STANDARD",
"Key": "testdata.txt",
"VersionId": "1631085066464",
"IsLatest": false,
"LastModified": "2021-09-08T07:11:06.464000+00:00",
"Owner": {
"DisplayName": "urn:ecs:iam::ns1:root",
"ID": "urn:ecs:iam::ns1:root"
}
}
]
}
Version ID 1631086460627 のオブジェクトは一覧に出力されることはなく、削除されたことが確認できました。ここまで、リテンション期間の設定、設定した期間内・期間終了後の削除操作時の動作についてご紹介してきました。ECSのサポートするObject Lockのリテンション期間を指定したオブジェクトのWORM機能についてご理解をいただき、ご興味を持っていただけたなら大変うれしく思います。
次回、Object Lockのもう一つの機能であるLegal Holdについて動作をご紹介したいと思います。
今回、ここまでお付き合いいただきありがとうございます。
杉本 直之
デルテクノロジーズ株式会社
UDS事業本部SE部