BLOBのサービスSASやBLOBコンテナーのサービスSASをJava SDKで作成したい

このエントリは2021/01/21現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。

何をしたいのか

具体的には、以下のドキュメントに記載の内容をJavaでできないか、ということ。ただし、Directoryの部分(Data Lake)の部分はやらない。

コンテナーまたは BLOB のサービス SAS を作成する / Create a service SAS for a container or blob
https://docs.microsoft.com/azure/storage/blobs/sas-service-create

ちょっと調べたら、Qiitaにあった。

JavaでAzure Blob Storageを操作する(SASトークン、ファイル操作)
https://qiita.com/ishibashi-futoshi/items/11642996d8f31e0fe539

「ではこれでええか」とも思ったが、備忘録として残しておいてもよいかと思い、書いておく。

前提

以下のQuickStartを終了していると、Storage SDKの使い方に戸惑わないと思われる。

クイック スタート:Java v12 SDK で BLOB を管理する / Quickstart: Manage blobs with Java v12 SDK
https://docs.microsoft.com/azure/storage/blobs/storage-quickstart-blobs-java

依存関係

Blobコンテナー、BlobのサービスSASトークンを取得したい場合、Microsoft Azure Client Library For Blob Storageを追加しておく。

Microsoft Azure Client Library For Blob Storage
https://mvnrepository.com/artifact/com.azure/azure-storage-blob

2021/01/21現在の最新バージョンは12.10.0。

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.10.0</version>
</dependency>

なお、階層型名前空間が有効になっているストレージ アカウント、つまりData LakeのDirectoryPathClientなどで操作したい場合は、Microsoft Azure Client Library For File Storage Data Lakeを追加しておく。

Microsoft Azure Client Library For File Storage Data Lake
https://mvnrepository.com/artifact/com.azure/azure-storage-file-datalake

2021/01/21現在の最新バージョンは12.4.0。

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-file-datalake</artifactId>
    <version>12.4.0</version>
</dependency>

BLOBのサービスSASを作成する

前提として、BlobServiceClientのインスタンスが以下で作成済みとする。

var blobServiceClient = new BlobServiceClientBuilder()
        .connectionString(CONNECTION_STRING)
        .buildClient();

上記ドキュメントのC#のコードと同じようなメソッドにすると、以下のような感じ。Qiitaの記事ではparse()を使っているが、setterで指定することももちろんできる。

public String getServiceSasUriForBlob( BlobServiceClient client ) {

    // SignedPermission (sp): AccountSasPermission.parse("rwacd") でも可
    var permissions = new AccountSasPermission()
            .setReadPermission(true)
            .setWritePermission(true)
            .setAddPermission(true)
            .setCreatePermission(true)
            .setDeletePermission(true);

    // SignedResourceTypes (srt): AccountSasResourceType.parse("oc") でも可
    var resourceTypes = new AccountSasResourceType()
            .setContainer(true)
            .setObject(true);

    //  SignedServices (ss): AccountSasService.parse("b") でも可
    var services = new AccountSasService().setBlobAccess(true);

    // SignedExpiry (se): SASトークンの有効期限は5分で指定
    var expiryTime = OffsetDateTime.now().plus(Duration.ofMinutes(5));

    // SASトークンを作成
    var sasValues = new AccountSasSignatureValues(expiryTime, permissions, services, resourceTypes);
    return client.generateAccountSas(sasValues);
}

作成したSASトークンは以下のような感じ。

sv=2020-04-08&ss=b&srt=co&se=2021-01-21T07%3A10%3A59Z&sp=rwdac&sig=tegD93llIofsuMgHSz%2Bs2Vc4Wc4ov70P%2BTKxcfkMnwE%3D

ssspsrtなどが指定した通りに入っていることがわかる。se2021-01-21T07:10:59Z、つまり2021-01-21T16:10:59+09:00。このリクエストを発行した時点の時刻が16:05:59なので、正しく5分の有効期限が設定されている。

BLOBコンテナーのサービスSASを作成する

前提として、上記BlobServiceClientを使ってすでにBlobContainerClientインスタンスを作成済みとする。

var containerClient = blobServiceClient.createBlobContainer(CONTAINER_NAME);

BLOBの場合と同様に、ドキュメントと記載を合わせると、以下のような感じ。ほぼ同じような流れだが、生成に必要なパラメータが権限とSASトークンの有効期限だけという点が異なる。

public String getServiceSasUriForBlobContainer( BlobContainerClient client ) {

    // SignedPermission (sp): BlobSasPermission.parse("rwacd") でも可
    var permissions = new BlobContainerSasPermission()
            .setReadPermission(true)
            .setWritePermission(true)
            .setAddPermission(true)
            .setCreatePermission(true)
            .setDeletePermission(true);

    // SignedExpiry (se): SASトークンの有効期限は5分で指定
    var expiryTime = OffsetDateTime.now().plus(Duration.ofMinutes(5));

    // SASトークンを作成
    var sasValues = new BlobServiceSasSignatureValues(expiryTime, permissions);
    return client.generateSas(sasValues);
}

作成したSASトークンは以下のような感じ。

sv=2020-04-08&se=2021-01-21T07%3A11%3A02Z&sr=c&sp=racwd&sig=8%2BjF%2B7Ji3mSXgk4qe5BPL2pLpP4CNuKDTNhSmB4Nh0Q%3D

sr(signedResource)は署名済みリソースで、この例の場合はContainerのみなのでcが指定されている。spは指定通りに設定されている。se2021-01-21T07:11:03Z、つまり2021-01-21T16:11:03+09:00。このリクエストを発行した時点の時刻が16:06:03なので、正しく5分の有効期限が設定されている。

Resources

以下はREST APIのドキュメントだが、SDKは内部でREST APIを呼び出しているだけ(換言するとJavaでラップしているだけ)なので、以下のドキュメントのほうがわかりやすいと思う。

アカウントSASを作成する / Create an account SAS
https://docs.microsoft.com/rest/api/storageservices/create-account-sas
サービスSASを作成する / Create a service SAS
https://docs.microsoft.com/rest/api/storageservices/create-service-sas

このエントリで作成したサンプルコードは以下から。

SAS-token-generation
https://github.com/anishi1222/SAS/

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中