0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Azure Storage Blob にバージョンレベルの不変性ポリシーを構成する(Azure SDK for .NET)

Last updated at Posted at 2022-08-17

概要

Azure SDK for .NET (Azure Storage.Blobs) で Azure ストレージアカウントにあるBlobに対して、BLOBレベルで不変性ポリシーを設定する。
Portal上から設定してる記事はあったが、SDKを使ってやってみたみたいな記事なかったので書いてみた。(公式Documentにほとんど書いてあるけど)

参考リンク

Azure Storage Accountを作成する

BLOB レベルで不変性ポリシーを構成させるには、ストレージアカウント作成時に「バージョンレベルの不変性のサポート」を有効にしないといけない。
注意したいのがこれは作成時にしか変更できないらしい。
設定ができたらPortalから作成したストレージアカウントへ行き、[データ管理] -> [データ保護] のアクセス制御の [バージョンレベルの不変性のサポートを有効にする] にチェックが入っているのが確認できる。
これにより、BLOBに対して不変性ポリシーを構成できる

試しに Azure Portal 上から不変性ポリシーをBLOBに構成してみる

[データストレージ] -> [コンテナー] からコンテナーを適当に作成する。

作成したらそこになんでもいいので適当なファイルをあげる
👇の画像のようにアクセスポリシーが選択できるようになっている
image.png
※[バージョンレベルの不変性のサポートを有効にする]にチェックが入っていないと出てきません。

[アクセスポリシー] -> [ポリシーの追加] を行うと以下の2つのポリシーの種類が選択できる

  • 訴訟ホールド
  • 時間ベースのアイテム保持

※ポリシーの種類の説明は公式Docをみましょう

いずれかのポリシーを設定したのち、対象のBLOBを削除してみると、削除できないことが確認できます。(時間ベースの場合は設定時間次第ですが)

SDK を用いて上記のことをコーディングしてみる

実装に用いたのは

Azure.Storage.Blobs にある Azure.Storage.Blobs.Specialized の BlockBlobClient Class です

公式 Document:BlockBlobClient 概要

目次

1.BLOB にアクセスする
2.BLOB にアクセスできるか疎通確認
3.時間ベースの不変性ポリシーを構成する
4.訴訟ホールドの不変性ポリシーを構成する
5.不変性ポリシーの削除 (時間ベース)
6.不変性ポリシーの削除 (訴訟ホールド)

1. BLOB にアクセスできるClient作る

BlockBlobClient を作成してBlobにアクセスする

var client = new BlobBaseClient(
  connectionString: "[接続文字列]",
  blobContainerName: "[Container Name]",
  blobName: "[Blob Name]" // 例 "契約書/04/file.pdf"
);
  • 接続文字列:作成したストレージアカウントから参照しましょう
  • blobContainerName / blobName:それぞれコンテナ名 / ブロブ名 を設定する

2. BLOB にアクセスできるか疎通確認

var res1 = client.Exists();
var res2 = client.ExistsAsync(); 

エラーも吐かず、res.ValueがtrueになってればひとまずOK。
Blobが存在しなかったら Value は false が返却される。

参考:BlobBaseClient.GetProperties

3.時間ベースの不変性ポリシーを構成する

var immutabilityPolicy = new BlobImmutabilityPolicy() {​​​ 
  ExpiresOn = DateTimeOffset.MaxValue,
  PolicyMode = BlobImmutabilityPolicyMode.Unlocked
}​​​;
client.SetImmutabilityPolicy(immutabilityPolicy: immutabilityPolicy);
  • ExpiresOn: (DateTimeOffset) そのポリシーの有効期限。上記ではとりあえずポリシー効けばいいやと思ってるのでMaxValueとかにしてます。お好きな日時にしてください。
  • PolicyMode:詳しくは調べてないが、lockedにするとポリシー削除ができなかったのでそのポリシーが編集できるかどうかの設定

参考:BlobBaseClient.SetImmutabilityPolicy

4.訴訟ホールドの不変性ポリシーを構成する

await client.SetLegalHoldAsync(hasLegalHold: true, cancellationToken: default);

訴訟ホールドのほうはtrue/false入れるだけで設定できる。

参考:BlobBaseClient.SetLegalHold

Portal 上ではこんな感じに設定されているのが確認できる

image.png

※👆画像ではロック済みになってるポリシーがありますが、Unlockedで設定すればロックされないです

5.不変性ポリシーの削除 (時間ベース)

await client.DeleteImmutabilityPolicyAsync();
  • ロックしてる場合、削除できないので注意

6.不変性ポリシーの削除 (訴訟ホールド)

await client.SetLegalHoldAsync(hasLegalHold: false);
  • 訴訟ホールドは false を設定するだけでPortal上から消えました

問題

  • 既にあるストレージアカウントこれやりたい場合はストレージアカウントを作り直さないといけない(作成時にしか設定できないため)
  • local 実行時に azurite 使ってみたがエラーで落ちる。([バージョンレベルの不変性のサポートを有効にする]みたいな設定がazuriteにある?未調査)
  • BlobBaseClientを使用するため(BlobレベルでClientを作らないとなので)、ポリシーの追加/削除の処理をするたびにClientを作らないといけないのでインスタンスの作りすぎとか起きないように注意が必要

まとめ

  • BLOBレベルで不変ポリシーを設定する場合はストレージアカウントを作る際に[バージョンレベルの不変性のサポートを有効にする]にチェックを入れましょう
  • ポリシーの削除を考えている場合は PolicyMode をUnlockedにすること
  • 時間ベースはSetImmutabilityPolicy() / 訴訟ホールドはSetLegalHoldAsync()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?