Azure Blob Storageが分かり辛かったので備忘録

f:id:ts0818:20220416151505j:plain

nazology.net

それはありふれた小さな隕石の爆発でしたが、2019年、この隕石について驚くべき論文がハーバード大学の二人の天文学者から発表されます。

「観測史上初の星間天体地球衝突」を報告した論文が政府の機密でずっと公開できずにいた! - ナゾロジー

それはこの隕石の極端な速度や軌道から見て、99%の確実性でこれが太陽系外から飛来した星間天体(星系間を渡る天体)だったというのです。

「観測史上初の星間天体地球衝突」を報告した論文が政府の機密でずっと公開できずにいた! - ナゾロジー

事実ならこれは観測史上初の星間天体の地球落下報告であり、驚くべき大発見です。

「観測史上初の星間天体地球衝突」を報告した論文が政府の機密でずっと公開できずにいた! - ナゾロジー

⇧ へぇ~!、へぇ~!、へぇ~!、トリビア~、じゃないですが、「星間天体」がよく分かりませんな...

恒星間天体(こうせいかんてんたい、Interstellar object)は、星間空間に存在していて、恒星などの天体に重力的に束縛されていない、恒星や亜恒星天体以外の天体である。

恒星間天体 - Wikipedia

また、特定の小惑星彗星太陽系外彗星を含む)など、恒星間の軌道を持つが一時的に恒星の付近を通過している天体に対しても、この用語が使われる

恒星間天体 - Wikipedia

⇧ う~ん...分からん

www.chem.saitama-u.ac.jp

⇧ 我々の属する系とは異なる場所にあるってことなんですかね?

 

Azureのサービス全体概要図

まぁ、Microsoftさん、何故か公式でサービスの全体概要図の情報を出してくれてないのが残念なのですが、Microsoft Learnのほうで確認できますと。

AZ-900っていう資格試験に関する学習の情報が掲載されてるページにあるんだけど、何故、もっと検索されやすいようにしないのか甚だ疑問です...

何だろう、サービス使ってもらいたいって思ってないのかな?

docs.microsoft.com

⇧ Azureのサービスで主要なものが確認できますと。

最も一般的に使用されるカテゴリを詳しく見てみましょう。

 
  • コンピューティング
  • ネットワーク
  • ストレージ
  • モバイル
  • データベース
  • Web
  • モノのインターネット(IoT)
  • ビッグ データ
  • AI
  • DevOps

https://docs.microsoft.com/ja-jp/learn/modules/intro-to-azure-fundamentals/tour-of-azure-services?ns-enrollment-type=learningpath&ns-enrollment-id=learn.az-900-describe-cloud-concepts

⇧ とあるのですが、今回は「ストレージ」サービスについてです。

Azure Storageというサービス

手前味噌で恐縮ですが、

ts0818.hatenablog.com

⇧ 過去記事で少しまとめてます。

公式のドキュメントによりますと、Azure Storageのサービスは、

docs.microsoft.com

Azure Storage プラットフォームには、次のデータ サービスが含まれています。

  • Azure BLOB:テキストおよびバイナリ データのための高度にスケーラブルなオブジェクト ストア。 また、Data Lake Storage Gen2 によるビッグ データ分析のサポートも含まれています。
  • Azure Files:クラウドまたはオンプレミスのデプロイ用のマネージド ファイル共有。
  • Azure キュー:アプリケーション コンポーネント間の信頼性の高いメッセージングのためのメッセージング ストア。
  • Azure テーブル:構造化データのスキーマレス ストレージのための NoSQL ストア。
  • Azure ディスク: Azure VM のためのブロック レベルのストレージ ボリューム。

Azure Storage の概要 - Azure のクラウド ストレージ | Microsoft Docs

⇧ 全部で5つ。

で、出端を挫かれるのが、

⇧ ストレージのサービス4つに分類されとったやん...数合わないやんけ...ってことだと思うのですが、おそらく、「Azure テーブル」って言ってるのは、

⇧ データのサービスの「Table Storage」のことを言ってるのかもしれないし、そうでないかもしれない、認識齟齬を招きかねないドキュメントの作り止めて欲しい...

で、肝心のAzureで提供されてるサービスを利用するには、

それぞれのサービスには、ストレージ アカウントを通じてアクセスします。 作業を開始するには、「ストレージ アカウントの作成」を参照してください。

Azure Storage の概要 - Azure のクラウド ストレージ | Microsoft Docs

⇧「ストレージアカウント」なるものを作成する必要がありますと。

詳しくは、

docs.microsoft.com

⇧ 上記に記載がありますと。

Azure Storageというサービスに限らずAzureのサービスを利用するには、「Azure アカウント」を作る必要があるらしいですと。

⇧ で、各Azureのサービスは「リソース」という形で提供されてますと。

で、この「リソース」については、

docs.microsoft.com

⇧ 上図のように、いろんな方法で利用することができるのですが、どの利用方法を選んだとしても「Azure Resource Manager」経由でのアクセスに集約されますと。

C#JavaPHPJavaScriptなどのプログラミングで「リソース」を利用する場合は、上図では「SDKs」というものを利用して「Azure Resource Manager」を経て「リソース」にアクセスすることになるんじゃないかと、図には書いてないから分からんけど。

Azure Blob Storageが分かり辛かったので備忘録

話が脱線してきましたが、ようやっと、本題。

Azure Blob Storageというサービスは、Azure Storageというサービスの中の1つであるのですが、

docs.microsoft.com

Azure Blob Storage は、Microsoftクラウド用オブジェクト ストレージ ソリューションです。 Blob Storage は、大量の非構造化データを格納できるよう最適化されています。 非構造化データとは、特定のデータ モデルや定義に従っていないデータであり、テキスト データやバイナリ データなどがあります。

Blob (オブジェクト) Storage の概要 - Azure Storage | Microsoft Docs

⇧ という説明にあるように、「非構造化データ」を格納するサービスとあり、

www.soumu.go.jp

総務省のデータ分析における説明では、あらゆるデータが「非構造化データ」に内包されると読めるので、語弊を恐れずに言うなら、すべてのデータを扱えるサービス、それがAzure Blob Storageというサービスになるかと。

Azure Blob Storageに話を戻すと、

Blob Storage には、3 種類のリソースがあります。

  • ストレージ アカウント
  • ストレージ アカウント内のコンテナー
  • コンテナー内の BLOB

Blob (オブジェクト) Storage の概要 - Azure Storage | Microsoft Docs

次の図に、これらのリソースの関係を示します。

f:id:ts0818:20220416131118p:plain

Blob (オブジェクト) Storage の概要 - Azure Storage | Microsoft Docs

⇧ とあって、説明がザックリ過ぎるというね(涙)。

ストレージアカウント

ストレージ アカウントは、データ用の一意の名前空間を Azure 内に用意します。 Azure Storage 内に格納されるすべてのオブジェクトには、一意のアカウント名を含むアドレスが割り当てられます。 アカウント名と Blob Storage エンドポイントの組み合わせによって、ストレージ アカウント内のオブジェクト用のベース アドレスが形成されます。

Blob (オブジェクト) Storage の概要 - Azure Storage | Microsoft Docs

⇧ 説明がもうちょい欲しい...一意のアカウント名を含むとして、

 アカウント + コンテナー + BLOB

のオブジェクトの名前が一意になるとは限らないってことなのか、オブジェクトの名前が重複するとしたら検索とかどうすりゃ良いですか、とかツッコミどころが満載なんですが...

で、そもそもとして、

  • アカウント
  • コンテナー
  • BLOB

の3つのうち、「アカウント」「BLOB」はmustってことは分かるんだけど、「コンテナー」がmustなのかがハッキリしない...

Azure Blob StorageのSDKJavaのドキュメント見ると、朧気に推測できるのですが、

docs.microsoft.com

URL format

Blobs are addressable using the following URL format: The following URL addresses a blob:

https://myaccount.blob.core.windows.net/mycontainer/myblob

Blob (オブジェクト) Storage の概要 - Azure Storage | Microsoft Docs

⇧ URL formatという説明から推測するに、

f:id:ts0818:20220416132948p:plain

⇧ 上図のような関係になっていると思われますと。

で、URL formatというからには、必ずこの形にしてね、約束だよってことだと思うので、「コンテナー」もmustってことだとは思う。

で、もう1つ、公式のドキュメントに何故、載せないのかが解せないのが、「サブディレクトリ」の扱いというね。

単純に、ググり方が下手で、上位表示されてこないだけなのかもしらんけど...

stackoverflow.com

⇧ stackoverflowの情報によると、「/(スラッシュ)」で区切れば「サブディレクトリ」を作ってくれるということらしい。

で、「サブディレクトリ」部分については、「BLOB」に含まれるということのようです。

つまり、Azure Blob Storage の「ストレージアカウント」を「hoge」で、「コンテナー」を「myhoge」でhoge.mp4ってファイルを、

 subdir01/subdir02/subdir03/subdir04/subdir05/hoge.mp4

みたいに保存した場合は、

f:id:ts0818:20220416140452p:plain

のような形で保存され、保存したオブジェクトにアクセスするURLは、

 https://hoge.blob.core.windows.net/myhoge/subdir01/subdir02/subdir03/subdir04/subdir05/hoge.mp4 

みたいな形になるってことですかね。

何で、こんな確認をしたかと言うと、URLがAzure Blob Storage のものかどうかを確認する必要があって、どうも、Azure Blob Storage のSDKJavaAPIで良しなにやってくれる方法が見つけられなかったので、自力でURLの文字列を切り出して確認する方法になってしまったからなんですがね...

BlobClientBuilderってAPIのドキュメントの冒頭の説明を読む限りでは、

docs.microsoft.com

This class provides a fluent builder API to help aid the configuration and instantiation of BlobClient and BlobAsyncClient, call buildClient() and buildAsyncClient() respectively to construct an instance of the desired client.

The following information must be provided on this builder:

  • the endpoint through .endpoint(), including the container name and blob name, in the format of https://{accountName}.blob.core.windows.net/{containerName}/{blobName}.
  • the credential through .credential() or .connectionString() if the container is not publicly accessible.

https://docs.microsoft.com/en-us/java/api/com.azure.storage.blob.blobclientbuilder?view=azure-java-stable

⇧ なんか、いけそうかもと思ったんですが、

endpoint(String endpoint)

Sets the service endpoint, additionally parses it for information (SAS token, container name, blob name)

If the blob name contains special characters, pass in the url encoded version of the blob name.

If the endpoint is to a blob in the root container, this method will fail as it will interpret the blob name as the container name. With only one path element, it is impossible to distinguish between a container name and a blob in the root container, so it is assumed to be the container name as this is much more common. When working with blobs in the root container, it is best to set the endpoint to the account url and specify the blob name separately using the blobName(String blobName) method.

https://docs.microsoft.com/en-us/java/api/com.azure.storage.blob.blobclientbuilder?view=azure-java-stable

⇧ そもそも、「root container」が何のことを言ってるのかサッパリ分からん...

さらに、

docs.microsoft.com

Azure Storage では、コンテナーと BLOB へのオプションの匿名パブリック読み取りアクセスがサポートされています。 既定では、データへの匿名アクセスは許可されません。 匿名アクセスを明示的に有効にしない限り、コンテナーとその BLOB へのすべての要求には承認が必要です。 匿名アクセスを許可するようにコンテナーのパブリック アクセス レベル設定を構成すると、クライアントは要求の承認なしでそのコンテナー内のデータを読み取ることができます。

コンテナーと BLOB の匿名パブリック読み取りアクセスを構成する - Azure Storage | Microsoft Docs

⇧「パブリック アクセス レベル」ってものがあるらしいのですが、「パブリック アクセス レベル」が何なのか説明ない...

azure.github.io

Specifies the level of public access that is allowed on the container.

The public access setting indicates whether the container and its blobs can be read via an anonymous request.

The BlobContainerPublicAccessType enumeration provides three levels of anonymous read access:

  • OFF, which prevents anonymous access.
  • BLOB, which permits anonymous read access to blob resources, but not to container metadata or to the list of blobs in the container.
  • CONTAINER, which permits anonymous read access to blob resources, container metadata, and the list of blobs in the container.

For more information on managing anonymous access to Blob service resources, see Setting Access Control for Containers.

BlobContainerPublicAccessType (Microsoft Azure Storage Client SDK 8.0.0 API)

⇧というか、Azure Blob StorageのSDKJava APIの説明少しばかり説明されてたけども、APIのドキュメントのほうを確認しないといけないとか、情報の参照先が見つけ辛過ぎる...

stackoverflow経由でしか情報を得られない辛さ...

stackoverflow.com

To elaborate more on the documentation, if the access level is:

  • Private: You cannot access a resource by using the resource URL. For example, if your blob's URL is https://account.blob.core.windows.net/container/blob.txt and if you try to access this resource in a browser, you will receive a 404 error even though the blob is present.
  • Blob: You can download a blob or get its properties by using the URL. However you will not be able to access a container's properties if the access level is set as Blob.
  • Public: It is similar to Blob public access level but if the ACL for a container is set as public, you can get a container's properties as well as list blobs in that container.

https://stackoverflow.com/questions/71845086/public-access-level-blob-vs-container

⇧ まぁ、何て言うか、Azure Blob StorageのSDKJava APIとマッチしてない気がするんだけど、SDKJava APIだと、Privateに該当する設定が無さそうだし...

もう、Microsoftのドキュメント読むの疲れたよ、パトラッシュ、僕はもう疲れたよ

というわけで、最終的に、結局、何も分からん状態に陥るという...

今回はこのへんで。