はじめに
自身が作成したICOSのバケットを削除する際、バケット内が空であるはずなのにバケット削除が出来ず困ったので、解決法をメモ書き程度ですがまとめておきました。
結論から述べるとバケット内に古いバージョンのオブジェクトおよび削除マーカーが残っていることが原因で削除が出来なくなっていました。一度でもバージョニングの設定をオンにしているとオブジェクトを全て削除しても過去に保存したオブジェクトの古いバージョンであったり削除マーカーが残ってしまうそうです。
ですのでこれらを削除してからバケットの削除を実施する必要があります。
削除方法として本記事でs3APIを使用した削除方法を記載します。
参考元としては以下の記事を使用しています。
AWS CLI を使ってバージョニングが有効化された Amazon S3 バケットを空にしてみた
環境確認
今回使用する環境は以下の通りです。
IBM Cloud Object Storage(Standartプラン), Smart Tierバケット(region : jp-osa)
バケット内が空のはずですが、バケットの削除に失敗する状態です。
バージョニング設定をオンにして確認してみると過去のバージョンや削除マーカーが残っていることが確認できます。
また、実施手順でaws CLIを使用するのであらかじめインストールする必要があります。
実施手順
1. aws configの設定
はじめに対象となるICOSのサービス資格情報を登録します。
資格情報はポータルのICOSメニューから「サービス資格情報」→「新規資格情報」で作成できます。
S3互換性のある資格情報が必要なので作成時に「HMAC資格情報を含める」をオンにしてください。
作成後、「cos_hmac_keys」の二つの値をaws configureに入力します。
$ aws configure
AWS Access Key ID : $ACCESSKEYID
AWS Secret Access Key : $SECRETACCESSKEY
Default region name : $REGION
Default output format : json
regionは対象となるバケットのリージョンを入力します。(今回はjp-osa)
2. Version + DeleteMakersの削除
続いてs3apiを用いてVersionsとDeleteMarkersの削除を実施します。
$ aws --endpoint-url https://$ENDPOINT s3api delete-objects --bucket $BUCKETNAME --delete "$(aws --endpoint-url https://$ENDPOINT s3api list-object-versions --bucket $BUCKETNAME | jq '.Versions + .DeleteMarkers | {Objects: map({Key, VersionId})}')"
{
"Deleted": [
{
"Key": "test1.png",
"VersionId": "00000185-38b7-1295-06e3-7b14c1c37404"
},
{
"Key": "test2.png",
"VersionId": "0000018d-1706-10f5-06c2-5b9272eb7cd9",
"DeleteMarker": true,
"DeleteMarkerVersionId": "0000018d-1706-10f5-06c2-5b9272eb7cd9"
},
...
]
}
deletedで削除しきれなかった過去versionやdeletemakerが削除されていることが確認できます。
実際にこの後にバケットの削除を実施すると削除することができました。