Java on Azure 実践開発【Blob Upload ④: 署名付き URL を使ったアップロード編】

## はじめに

本記事は、『Java on Azure 実践開発 Blob Upload』シリーズの第4回「期限付き URL を使ったアップロード」編です。
サンプルコードは、[kohei3110/JavaOnAzure-BlobStorage](https://github.com/kohei3110/JavaOnAzure-BlobStorage) に上がっています。

## シナリオ概説

本シリーズでは、Blob Storage へのファイルアップロードについて、Azure を使った Java アプリケーションのサンプルコードを使用しながら、開発方法をご紹介します。

一口にファイルアップロードといっても、あらゆる方式があるかと思います。例えば、以下のようなものがあります。

| No. | シナリオ |  概要 | 記事 URL |
| :--- | :--- | :--- | :--- |
| 1 | サーバー経由でのストリームライクなアップロード | SAS の流出を懸念する場合、サーバー経由でのストリームライクなアップロード | [Java on Azure 実践開発【Blob Upload ①: ストリームライクなアップロード編】](https://qiita.com/kk31108424/items/63ab4fdd0492e344573a) |
| 2 | サーバーに一時保存後アップロード | アプリケーションサーバーのローカルストレージにファイルを一度保存後、アップロード（クライアントからは同期に見える） | [Java on Azure 実践開発【Blob Upload ②: App Service ローカル保存後アップロード編】](https://qiita.com/kk31108424/items/366649945294a50b808a) |
| 3 | サーバーに一時保存後定期アップロード | アプリケーションサーバーのローカルストレージにファイルを一度保存後、**定期ジョブにて**アップロード（クライアントからは非同期に見える） | [Java on Azure 実践開発【Blob Upload ③: 定期アップロード編】](https://qiita.com/kk31108424/items/5182adf18695238fc1e1) |
| 4 | 署名付き URL を使ったアップロード | アプリケーションから返却された署名付き URL を用いて、クライアントからファイルをアップロードする | [Java on Azure 実践開発【Blob Upload ④: 署名付き URL を使ったアップロード編】](https://qiita.com/kk31108424/items/314027635b4518b2a6b2) |

本記事では、<b>『4. 期限付き URL を使ったアップロード』</b>について実装上のポイントを解説していきます。

## 実装内容

クライアントからのリクエストに対して、署名付き URL を返す API を定義します。クライアントは、API から受け取った署名付き URL を使って、ファイルを Blob ストレージにアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/68d51e92-27fa-be65-261e-4e2e3fa5adbf.png)

### SAS

SAS とは、Azure Storageリソースへの制限付き（一定期間、特定リソースのみ、など）アクセス権を付与する署名付きURIのことです。SAS を使用すると、クライアントがデータにアクセスする方法をきめ細かく制御できます。

詳細は、Docs をご覧ください。

Docs: 『[Shared Access Signatures (SAS) を使用して Azure Storage リソースへの制限付きアクセスを許可する](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-sas-overview)』

## 実装に必要な SDK のクラス

実装にあたって、Azure SDK for Java を使用しました。SDK を使うため、私の方でいくつかクラスを作りました。以下は、その UML 図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/99ff4d6f-8a1f-643c-a3f0-2eb452e3f9e5.png)

ここからは、実装する際に必要となる SDK のクラスについて解説していきます。

### BlobContainerSasPermission クラス

Blob ストレージコンテナへの SAS を生成するための helper クラスです。このクラスに定義された setter メソッドを使用することで、クライアントに対する各オブジェクトに対する権限を定義可能です。

権限を `true` にセットすると、その権限が許可されます。

今回は、クライアントに対し、「書き込み」「作成」権限を許可するよう構成しています、

```java:GetSasService.java
・・・
        BlobContainerSasPermission permission = new BlobContainerSasPermission()
            .setReadPermission(false)
            .setWritePermission(true)
            .setAddPermission(false)
            .setCreatePermission(true)
            .setDeletePermission(false);
・・・
```

なお、[`BlobContainerSasPermission#parse()`メソッド](https://docs.microsoft.com/en-us/java/api/com.azure.storage.blob.sas.blobcontainersaspermission.parse?view=azure-java-stable)も用意されており、これを使って権限を定義することも可能です。
ただ、[`BlobContainerSasPermission#parse()`メソッド](https://docs.microsoft.com/en-us/java/api/com.azure.storage.blob.sas.blobcontainersaspermission.parse?view=azure-java-stable)は、定義する権限の順番が決められているため、使いにくい印象があります。
具体的には、権限を「r（読み取り）, a（追加）, c（作成）, w（書き込み）, d（削除）, l（一覧）」の順番で指定しないといけず、コードの可読性に欠ける印象があります。

## 留意事項

今回は、クライアントへ SAS が付与された Blob ストレージへの接続文字列を返すまでを実装しています。
クライアントからは、返ってきた接続文字列を使って、Blob をアップロードすることが可能ですが、クライアントコードは記述していません。

お時間のある方は、クライアントからファイルをアップロードするコードを書いてみてください。

## おわりに

本記事は、『Java on Azure 実践開発 Blob Upload 編】④』として、アプリケーションから返却された期限付き URL を用いて、クライアントからファイルをアップロードする方法についてまとめました。

これで、Java on Azure 実践開発 Blob Upload 編は終了です。

次回シリーズもお楽しみに～。