IBM Cloud Object Storage (ICOS) の Expiration Rule 詳細


# はじめに
IBM Cloud Object Storage (ICOS) の Expiration Rule （オブジェクト期限設定）機能がリリースされましたのでお知らせいたします。

オブジェクトの期限が設定できることにより、ユーザーは不要なデータの削除をあらかじめスケジュールしておくことで、ストレージのコストを適切に管理できるようになります。

事前定義された期間（経過日数）または特定の日付で、オブジェクトの削除をスケジュールするためのルールを定義できます。

概要は [ICOS(IBM Cloud Object Storage)のLifeCycle管理 - Qiita](https://qiita.com/testnin2/items/61af033419b39faa4f99) をみてください。

# 特定の日付で有効期限を設定する方法
2019年6月27日時点では、UI で設定できないため、 `curl` コマンドを使って設定する方法を書きます。
バケットあたりに1つの XML ファイルで管理されているので、既存設定がある場合は XML ファイルに含めてリクエストを投げるようにしてください。
そうしないと上書きされて既存設定が消えてしまいます。

## IBM Cloud コマンドでログイン

```
ibmcloud login
```

## 変数の設定
環境に合わせて変えてください。

```
export BUCKET_NAME=3minutes-ibmcloud-expire
export ENDPOINT=s3.jp-tok.cloud-object-storage.appdomain.cloud
```

## IAM トークンの取得

```
export ACCESS_TOKEN=`ibmcloud iam oauth-tokens | head -n 1 | awk '{print $5}'`
```

>[IBM CloudにおけるIAMトークンの取得方法 - Qiita](https://qiita.com/testnin2/items/3a4ca8a1a2b79b713c48)

## 現在の Expiration Rule 設定の確認
こちらのコマンドで確認できます。

```
curl -X "GET" "https://$BUCKET_NAME.$ENDPOINT/?lifecycle" \
-H "Authorization: Bearer $ACCESS_TOKEN" 
```

## XML の用意
このサンプルを使います。

```
<LifecycleConfiguration>
    <Rule>
        <ID>delete-on-a-date</ID>
    <Filter>
      <Prefix>foo/</Prefix>
    </Filter>
        <Status>Enabled</Status>
        <Expiration>
            <Date>2020-06-01T00:00:00.000Z</Date>
        </Expiration>
    </Rule>
</LifecycleConfiguration>
```

## MD5 チェックサムの準備
準備した XML を使って必要なヘッダー情報を事前にセットします。

```
export MD5SUM=`echo -n '<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><ID>delete-on-a-date</ID><Filter><Prefix>foo/</Prefix></Filter><Status>Enabled</Status><Expiration><Date>2020-06-01T00:00:00.000Z</Date></Expiration></Rule></LifecycleConfiguration>' | openssl dgst -md5 -binary | openssl enc -base64`
```

## リクエストの送信
用意した情報を使って、設定リクエストを投げます。

```
curl -X "PUT" "https://$BUCKET_NAME.$ENDPOINT/?lifecycle" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-MD5: $MD5SUM" \
-H "Content-Type: text/plain" \
-d '<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><ID>delete-on-a-date</ID><Filter><Prefix>foo/</Prefix></Filter><Status>Enabled</Status><Expiration><Date>2020-06-01T00:00:00.000Z</Date></Expiration></Rule></LifecycleConfiguration>'
```

## 設定の確認
こちらのコマンドで確認できます。

```
curl -X "GET" "https://$BUCKET_NAME.$ENDPOINT/?lifecycle" \
-H "Authorization: Bearer $ACCESS_TOKEN" 
```

## UI 画面での確認
残念ながら、画面表示されないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7b08d0cd-2ac2-b44b-501f-3615e7762a5e.png)

# オブジェクトごとに有効期限を確認する方法
Expiration Rule を複数設定している場合、このオブジェクトはいつ削除されるのかの判断が難しいことがあります。
その場合は、この方法を使ってオブジェクトのヘッダー情報を確認するようにしてください。
どのルールが適用されて、いつ削除されるのかが確認できます。

## オブジェクト名変数の設定

```
export OBJECT_NAME=image.png
```

## オブジェクト有効期限の取得

```
curl -I "https://$BUCKET_NAME.$ENDPOINT/$OBJECT_NAME" -H "Authorization: Bearer $ACCESS_TOKEN"
```

```
HTTP/1.1 200 OK
Date: Thu, 27 Jun 2019 10:35:40 GMT
X-Clv-Request-Id: 368b254d-a5a3-44db-95f3-7e77f7f90c65
Server: Cleversafe/3.14.4.96
X-Clv-S3-Version: 2.5
Accept-Ranges: bytes
x-amz-request-id: 368b254d-a5a3-44db-95f3-7e77f7f90c65
ETag: "3304d4b0681e60535174c9e0c446bce1"
Content-Type: image/png
Last-Modified: Thu, 27 Jun 2019 10:35:33 GMT
x-amz-expiration: expiry-date="Mon, 01 Jun 2020 00:00:00 GMT", rule-id="delete-on-a-date"
Content-Length: 216318
```

`x-amz-expiration: expiry-date="Mon, 01 Jun 2020 00:00:00 GMT", rule-id="delete-on-a-date"` 
となっていることが確認できます。

#参考
- [Delete stale data with expiration rules - IBM Cloud Docs](https://cloud.ibm.com/docs/services/cloud-object-storage?topic=cloud-object-storage-expiry&locale=en)