Azure File Storageを介したBlob Storageの使用方法

ある時点で、安価で効率的なファイルの保存ソリューションが必要になるかもしれませんが、そのようなソリューションはどこで見つけることができるのでしょうか? Microsoft Azureのバイナリ ラージ オブジェクト (blob) ストレージを調べてみてください! Blob ストレージは、Azure ストレージ サービスの1つであり、大量のテキストおよびバイナリ データ ファイル、ストリーミング コンテンツ、または配布用の静的コンテンツを保存することができます。

このチュートリアルでは、一般的な例を通じて Azure の Blob ストレージの使用方法について学びます。

続けて読んで、始めましょう!

前提条件

このチュートリアルは、実際のデモンストレーション形式で行われます。一緒に進める場合、以下のものがインストールされているか利用可能であることを確認してください。

Azure環境の構築

ファイルを保存するためにblobストレージを使用する前に、まずPowerShell Coreモジュールをインポートし、Azureサブスクリプションに接続し、Azure環境を構築する必要があります。

1. PowerShell 7を起動し、以下のコマンドを実行して、blobストレージにファイルを保存するために使用するモジュールをインポートします。

Importing the necessary modules
# Az.Accounts - 認証情報管理のコマンドレットを提供する
# Az.Resources - サブスクリプションなどのトップレベルのAzureリソースプロバイダーとの操作のためのコマンドレットを提供する
               # Az.Storage - ブロブなどの異なるストレージリソースの操作をサポートするコマンドレットを提供する
#
             #
Import-Module Az.Accounts, Az.Resources, Az.Storage

2. 次に、Azure Active Directory (AD) テナントにログインし、以下のコマンドを実行して、ウェブブラウザでの対話型認証を完了します。

このチュートリアルの範囲を超えて、他の認証方法もあります。たとえば、サービス プリンシパルを使用する方法や、アクセストークンを使用する方法などがあります。

Connect-AzAccount
Azure Portal interactive login.

ログイン後に表示されるテナントとサブスクリプションが意図したものであることを常に確認してください。必要に応じて、コンテキストを変更することができます。

3. 次のコマンドを実行して、demoという名前の新しいリソース グループを作成し、5桁のランダムな数字が追加されます(Get-Random -Maximum 99999)。リソース グループは階層的にサブスクリプションの下にあり、より細かい管理が可能なリソースを含んでいます。

この例では、リソース グループの-LocationCentral USに設定されています。コマンドが完了すると、結果は$resourceGroup変数に格納されます。

$resourceGroup = New-AzResourceGroup "demo$(Get-Random -Maximum 99999)" -Location 'Central US'
Creating a new resource group

以下のコマンドを実行して、次のタスクを実行し、新しいAzureストレージアカウントを作成します。この例では、ストレージアカウントの名前は”storage”であり、5つのランダムな数字(Get-Random -Maximum 99999)が追加されます。コマンドが完了した後、$storageAccount変数に返されたオブジェクトが保存されます。

# ResourceGroupNameプロパティを使用して-ResourceGroupNameを渡す
# ステップ3で作成した$resourceGroup変数のResourceGroupNameプロパティ
# ストレージアカウントの-Nameにランダムな数字を追加
# リソースグループと同様に
# -Locationを$resourceGroup変数のLocationプロパティと同じに設定
# 親リソースグループと同じリージョンにリソースを配置するのは良い慣行です。
# ストレージアカウント名-SkuNameを指定し、
# ローカル冗長ストレージ(LRS)またはAzure内でグローバルに一意の名前を使用

$storageAccount = New-AzStorageAccount `
 -ResourceGroupName $resourceGroup.ResourceGroupName `
 -Name storage$(Get-Random -Maximum 99999) `
 -Location $resourceGroup.Location `
 -SkuName Standard_LRS
Creating a new storage account

以下のコマンドを実行して、Azure ADロールの割り当てに対していくつかのタスクを実行します。

  • -SignInName の値は、Get-AzAccessToken コマンドレットによって返される UserID プロパティを介して現在ログインしているアカウントを使用します。
  • -RoleDefinitionName の値は、割り当てる組み込みの Storage Blob Data Contributor ロールです。
  • -Scope の値は、作成したストレージアカウント(以下に示す storage10029)のロール割り当てのスコープを設定します。これは $storageAccount 変数の Id プロパティです。

必要に応じて、個々のコンテナに対してより詳細なロール割り当てを行うこともできます。

New-AzRoleAssignment `
 -SignInName (Get-AzAccessToken).UserId`
 -RoleDefinitionName "Storage Blob Data Contributor"`
 -Scope $storageAccount.Id
Creating and verifying a new file

6. 最後に、以下のコマンドを実行して、ローカルシステムに temp.dat という名前のファイルを作成します。これは後のセクションでブロブストレージの動作を示すため、ストレージアカウントにファイルをアップロードおよびダウンロードします。

# FileStream .NET クラスを読み込む
$file = New-Object System.IO.FileStream .\temp.dat,Create,ReadWrite
# ファイルのサイズを設定する
$file.SetLength(10MB)
# ハンドルを閉じる
$file.Close()
# サイズを確認するためにファイルを検索する
(Get-ChildItem $file.Name).Length
Creating and verifying a new file

PowerShell を使用したファイルのアップロード

Azure環境を構築し、サンプルファイルを作成したら、ファイルをBlobストレージにアップロードしましょう。Blobストレージは、標準のファイルシステムとは異なる方法で動作します。Blobストレージ内の各ファイルはオブジェクトとして扱われ、コンテナ内に保管されます。

Blobsの主な機能は他のファイルシステムと似ていますが、どちらがより適したケースもあります。Blobsは仮想ファイルシステム(例:BlobFuse)のバックエンドにもなることがあります。

Microsoftは、PowerShell、AzCopy、およびAzure Portalを介してストレージアカウントにファイルをアップロードするための複数の方法を提供しています。しかし、まずはPowerShellを使用してサンプルファイル(temp.dat)をBlobストレージにアップロードしましょう。PowerShellを使用すると、Azureストレージアカウントとの作業を一貫した体験で行うことができます。

このデモを実行するためには、必要なアクションによってコストが発生します。使用しなくなったリソースは削除し、消費量を監視してください。

以下のコマンドを実行して新しいコンテナを作成し、temp.datファイル($file)をオブジェクトとしてアップロードします。この例ではコンテナの名前をdemoとしていますが、好みに応じて異なる名前を付けることができます。

# ストレージアカウントのContextプロパティを使用して、$storageAccount内にコンテナを作成します
# 返されたオブジェクトは、$container変数に渡されます
$container = New-AzStorageContainer -Name demo -Context $storageAccount.Context
# temp.datファイル($file)をdemoコンテナ($container)にアップロードします
# ブロブ名(-Blob)は、アップロードしているファイルの名前と同じになります(Get-ChildItem $file.Name)
Set-AzStorageBlobContent -File $file.Name -Container $container.Name -Blob (Get-ChildItem $file.Name).Name -Context $storageAccount.Context
Uploading a file to Azure Storage Account

AzCopyを使用したファイルのアップロード

おそらく、より複雑なユースケース(例:コンテンツの同期、異なるアカウント間のコンテンツのコピーなど)があるかもしれません。その場合は、AzCopyコマンドラインツールが必要です。

以下のコマンドを実行して、Azureテナントにログインし、ローカルファイル($file)をコンテナのURLエンドポイントにコピーします。AzCopyはPowerShellで使用している資格情報を認識していないため、Azureテナントにログインする必要があります。

# Azureテナントにログインします
& .\azcopy.exe login
# ローカルの$fileを宛先の$containerの完全なURIにコピーします
& .\azcopy.exe copy $file.Name $container.CloudBlobContainer.Uri.AbsoluteUri
Uploading to Azure Storage Account using AzCopy

アップロードする代わりに、AzCopyを使用してファイルをダウンロードすることもできます。その場合、以下のコマンドを実行して指定したファイル(temp.dat)をコンテナから現在のローカルディレクトリにcopyします:& .\azopy.exe copy "$($container.CloudBlobContainer.Uri.AbsoluteUri)/temp.dat" .\temp.dat

Azureポータルを介したファイルのアップロード

ファイルをアップロードするためのGUIメソッドをお好みの場合、Azure Storage Explorerが便利です。Azure Storage Explorerは、Blobストレージを管理するための最高のグラフィカルメソッドの一つです。Azureポータルのストレージアカウントリソースからストレージエクスプローラにアクセスできます。

1. 好きなウェブブラウザを開き、Azureポータルのストレージエクスプローラに移動します。

2. BLOB CONTAINERSの下にあるdemoコンテナをクリックし、次にアップロードをクリックしてブロブのアップロードブレード(右パネル)にアクセスします。

3. 次に、ブロブのアップロードパネルのフォルダアイコンをクリックして、アップロードするファイル(temp.dat)を選択します。

4. 最後に、ファイルをアップロードするためのアップロード(青いボタン)をクリックします。

Using the Upload blob blade in Azure Storage Explorer

アップロードが完了すると、アップロード blobブレードを閉じて、以下の画像のようにアップロードされた blob を確認できます。

Viewing contents of a blob container in Azure Storage Explorer

Azure Portalを介してファイルをダウンロードする

Blob ストレージへのコンテンツのアップロードと同様に、Azure はさまざまな方法でコンテンツのダウンロードをサポートしています。ただし、Azure Portalを介して(temp.dat)ファイルをアップロードしたばかりなので、Azure Storage Explorerを使用して同じファイルをダウンロードしましょう。

Azure Storage Explorerでダウンロードするファイル(temp.dat)を選択し、次に示すようにダウンロードボタンをクリックします。これにより、次のステップで確認ダイアログボックスが開きます。

Selecting Files to Download

次に、選択したファイルをダウンロードするためのダウンロードの開始はこちらをクリックボタンをクリックします。

Downloading Selected Files from the Blob Storage

PowerShellを使用したファイルのダウンロード

ファイルのアップロードと同様に、PowerShellを実行してブロブストレージからファイルをダウンロードするオプションもあります。PowerShellを使用すると、コンテナ内のオブジェクトをリストし、それらをダウンロードすることができます。

以下のコマンドを実行して、コンテナ内のすべてのオブジェクトをリストし、temp.datをローカルディレクトリにダウンロードします。

# $container 内のすべてのオブジェクトをリストして、空のコンテナが作成されたことを確認
Get-AzStorageBlob -Container $container.Name -Context $storageAccount.Context
# $container から temp.dat オブジェクトをダウンロード
Get-AzStorageBlobContent -Blob temp.dat -Container $container.Name -Context $storageAccount.Context
Downloading files from Azure Storage Account

ファイルのダウンロードに一時的な一意のリンクを使用する場合、共有アクセス署名(SAS)トークンを使用して事前認証されたダウンロードリンクを作成できます。これらのトークンは一意でプライベートな認証トークンであり、アクセスを確認するために使用できます。

以下のコマンドを実行して、ダウンロードしたいファイル(temp.dat)の新しいダウンロードリンクを作成します。生成されたダウンロードリンクは10秒後に期限切れになり、そのリンクを使用してコンテンツをダウンロード(Invoke-WebRequest $uri)し、$temp変数に保存します。

# 10分間有効な新しいダウンロードリンクを生成する
$uri = New-AzStorageBlobSASToken -Context $storageAccount.Context -Container $container.Name -Blob temp.dat -Permission r -ExpiryTime (Get-Date).AddSeconds(10) -FullUri
# リンクを使用してファイルを $temp 変数にダウンロードする
$temp = Invoke-WebRequest $uri

# またはファイルを現在のディレクトリに書き込む
Invoke-WebRequest $uri -OutFile .\temp.dat
Download from Azure Storage Account using a SAS token

ブロブストレージからパブリックインターネット上でウェブページをホストする

これまで、認証されたユーザーによるファイルのダウンロードの使用例を見てきました。しかし、ブロブストレージはパブリックコンテンツの優れたオプションを提供できることをご存知でしょうか?例えば、このデモでは、ウェブページのコンテンツをホストするためにブロブを使用します。

ウェブページのコンテンツが移動中および静止中に暗号化されていても、パブリックアクセスが設定されている場合は誰でもそのコンテンツにアクセスできます。

異なるユースケースを設定しているため、パブリッククラウドの主な利点の1つであるスケーラビリティと弾力性を活用します。特定のユースケースに対して新しいストレージアカウントをプロビジョニングし、パブリックコンテナの使用リスクを制限できます。

1. 以下のコマンドを実行して、Azure環境の「Azure環境の構築」セクションのステップ4と同じように新しいストレージアカウントを作成します。ただし、今回は返されたオブジェクトを$publicStorageAccount変数に渡します。

$publicStorageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroup.ResourceGroupName -Name storage$(Get-Random -Maximum 99999) -Location $resourceGroup.Location -SkuName Standard_LRS
Creating a storage account

これで、パブリックコンテンツ用の専用のストレージアカウントが作成されました。次のコマンドを使用して、静的なウェブコンテンツをホストするためにこのストレージアカウントを構成できます。

2. 次に、Enable-AzStorageStaticWebsiteコマンドレットを実行して、新しいユースケースのためのストレージアカウント($publicStorageAccount)を構成します。 -IndexDocumentはユーザーに表示するデフォルトのウェブページを設定します。 -Contextは、さきほど作成した新しいストレージアカウントになります。

# $webコンテナを作成し、ストレージアカウントを構成する
Enable-AzStorageStaticWebsite -IndexDocument index.html -Context $publicStorageAccount.Context
Enable storage account for website hosting

3. 以下のコマンドを実行して、現在のディレクトリに新しいHTMLドキュメントを作成し、ウェブコンテンツのホスティング用のコンテナにそのドキュメントをアップロードします。コンテンツタイプはHTML(ContentType="text/html")に設定されているため、ウェブブラウザがドキュメントを適切に解釈できます。

ウェブブラウザでドキュメントにアクセスすると、Hello from <storage account name> のメッセージが表示されます。

# 簡単なHTMLファイルを作成します
"<body><h1>Hello from $($publicStorageAccount.StorageAccountName)!</h1></body>"|Out-File .\index.html
# HTMLファイルを静的なウェブホスティングコンテナにアップロードし、ContentTypeをtext/htmlに設定します
Set-AzStorageBlobContent -File .\index.html -Container "`$web" -Properties @{ContentType="text/html"} -Context $publicStorageAccount.Context
Create and upload an HTML document

4. 以下のコマンドを実行して、ユーザーがコンテンツにアクセスできるURLを取得します。

$publicStorageAccount.PrimaryEndpoints.Web
Get the URI of the endpoint

5. 最後に、URLをブラウザで開くと、以下のスクリーンショットに似たものが表示されます。

Accessing HTML Document from Blob Storage

リソースのクリーンアップ

blobストレージの新しいコンセプトをテストしたので、リソースをクリーンアップする必要があります。なぜなら、それによってサブスクリプションを清潔に保つことができるからです。さらに重要なことは、追加の料金が発生しなくなります。

このチュートリアルで使用したすべてのリソースが単一のリソースグループにあるため、リソースグループを削除することですべてのリソースをクリーンアップできます。

リソースは常に単一のリソースグループ内に含まれるわけではありませんが、特に頻繁にテストや反復を行う場合には、論理的なセグメントの自由な使用が有益であることが示されます。

以下のコードを実行して、リソースグループとその内部のすべてのリソースを削除するために、$resourceGroup 変数の ResourceGroupName プロパティを指定して、Remove-AzResourceGroup コマンドレットを実行します。

Remove-AzResourceGroup -Name $resourceGroup.ResourceGroupName
Delete resource group and contents

結論

このチュートリアルでは、さまざまなプラットフォームでクラウドストレージのブロブにファイルをアップロードおよびダウンロードする方法について触れました。また、ブロブストレージからウェブページをホストし、ユーザーが公開でアクセスできることも学びました。

blobストレージや他のストレージタイプを使用すると、さまざまなことができます。これらの概念を活用する方法は、ファイルストレージアカウントを使用したり、サーバーレスのファイルシステムを提供したり、Azure仮想マシンでの仮想ハードディスクとしてページBlobを使用したりすることです。

Source:
https://adamtheautomator.com/blob-storage/