このエントリは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
ss
やsp
、srt
などが指定した通りに入っていることがわかる。se
は2021-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
は指定通りに設定されている。se
は2021-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/
「Blob storageのサービスSASやBlobコンテナーのサービスSASをJava SDKで作成したい」への1件のフィードバック