はじめに
ローカルのExcel、PDF、画像などのバイナリデータをクラウドに保存したい場合、Azure Blob Storageを使うのは非常に便利です。
ですが、毎回Azureのコンソール画面で手動によるファイルをアップロードするのは手間がかかります。
そこで、ローカルにファイルが置かれたら自動的にクラウドへ転送する仕組みをPowerShellとAzCopyを使って構築できるかどうかを検証しました。
本記事の対象者
・Azureの基本的なサービス(Blob StorageやSASキーなど)や仕組みを理解している方
・Azure StorageアカウントとBlobコンテナが既に作成されていること
・PowerShellやバッチスクリプトの実行に慣れている方
準備
Azureアカウントがあり、サービスを利用できる方
検証
Auzre Blobの作成
まずは、AzureポータルからBlobストレージを作成します。
これはファイルを保管する領域になります。
手順
1.Azureポータルにログインし、"Storage account"を選択。
2.新しいストレージアカウントを作成し、Blobストレージを有効化します。
3.作成したストレージアカウント内に、新しいBlobコンテナを作成して、ファイルを保存する場所を確保します。
SASキーの発行
手順
AzureポータルのBlobコンテナページに移動。
「Shared access signature」をクリックし、必要なアクセス権限を設定。
「Generate SAS and connection string」をクリックし、SASトークンをコピーします。
PowerShellでAzCopyをインストール
ファイル転送に使うツールとして、AzCopyを使用します。
AzCopyはMicrosoftが提供しているコマンドラインツールで、簡単にファイルをAzure Storageへコピーできます。
インストールするのに時間がかかります。
インストール対象をAzCopyモジュールの一部に絞れば早く終わるかも。
・PowerShellにAzモジュールをインストールするコマンド
Install-Module -Name Az -AllowClobber -Scope CurrentUser
・Azモジュールをロードするコマンド
Import-Module Az
・コマンド実行後、フォルダにモジュールファイルがダウンロードされる
PowerShellスクリプトの作成と実行
PowerShellスクリプトを実行すると、ローカルの指定したフォルダに新しいファイルが追加された際に、AzCopyが自動でAzure Blobにアップロードします。
$context = New-AzStorageContext -StorageAccountName "ChangeYourAzureStrageAccount" -SasToken "ChangeYourSasToken"
$directory = "ChangeYourLocalDirectory"
$filter = "*.pdf"
Write-Host "ディレクトリ内のファイルをアップロード中..."
# 指定したディレクトリ内の既存のPDFファイルをすべてアップロード
Get-ChildItem -Path $directory -Filter $filter -Recurse | ForEach-Object {
$file = $_.FullName
Write-Host "アップロード中: $file"
try {
Set-AzStorageBlobContent -File $file -Container "bunpaidoc" -Context $context
Write-Host "ファイルをアップロードしました: $file"
} catch {
Write-Host "エラーが発生しました: $_"
}
}
Write-Host "既存のファイルのアップロードが完了しました。"
# ファイルシステム監視を開始
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $directory
$watcher.Filter = $filter
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
Write-Host "ファイルシステム監視を開始しました。"
$action = {
$file = $Event.SourceEventArgs.FullPath
Write-Host "新しいPDFが検出されました: $file"
try {
Set-AzStorageBlobContent -File $file -Container "bunpaidoc" -Context $context
Write-Host "ファイルをアップロードしました: $file"
} catch {
Write-Host "エラーが発生しました: $_"
}
}
Register-ObjectEvent $watcher 'Created' -Action $action
Write-Host "イベントが登録されました。"
結果
ローカルの指定したフォルダにファイルを新規で登録するとBlobにアップロードされた。
感想
この方法を使用することで、社内文書や他のファイルをクラウドへ簡単にアップロードできるだけでなく、
クラウドからローカルへのダウンロードもAzCopyを使用して同様に簡単に実行できます。
ファイルの転送を自動化することで、手作業の時間を削減し、効率化が期待できます。