2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Azure Blob Storage へのフォルダ・ファイルアップロード

Posted at

ローカルPCに置いてあるファイルを Azure Blob Storage へアップする方法はたくさんあります。
安全にデータをアップロードする方法の1つに REST を使ったものがあります。
https://docs.microsoft.com/ja-jp/azure/databox/data-box-deploy-copy-data-via-rest

なのですが、これは手数が多すぎると思い Azcopy を使うPowerhellスクリプトを構築してみました。
対象マシンが複数ある場合、スクリプトの配布+α で済むかと思います。

前提としては、上記Azcopyコマンドのインストール済み、Azure Storage Account を持っている状態とします。
また、アップロード確認用に Azure Storage Explorer をインストールしておきましょう。
上記ツール等の設定は他を参照してください。
・Azcopy インストール
・Azure Storage Account
・Azure Storage Explorer

1. Blog Container 作成

ストレージアカウントの画面で上の[+コンテナー]をクリックし、Blobコンテナーを作成します。

02.2.jpg

2. Blob の Shared Access Signature(SAS) 取得

Blob を表示し、左にある[共有アクセストークン]をクリックします。

02.3.1.jpg

ここで、お好みに合わせてアクセス許可を変更します。(ここでは「書き込み」Onlyで設定)
その後、[SASトークンおよびURLを生成]ボタンをクリックし、[BLOB SAS URL]をコピーします。
02.6.jpg

:four_leaf_clover:ここで Azcopy を使って適当なファイルをがアップロードできるか、Azure Storage Explorer にて確認しておきましょう。

まだ、Blob には何もアップロードされていません。

02.6.1.png

PowerShell ウィンドウを開き、Azcopy にて hoge.log ファイルをアップロードします。

02.6.2.png

その結果、Storage Explorer に hoge.log ファイルがアップロードされました。

02.6.3.png

3. psスクリプト作成

ファイルがどんな名称のPCから送られたのか分かるように、また日付単位でフォルダを切りたいと思います。
サンプルスクリプト

# 処理対象のフォルダ
$str_copy_from = '.\srcDir'  # オリジナルディレクトリ
$str_copy_to = '.\tempDir'   # 一時保存用ディレクトリ

# フォルダコピー  (オリジナルディレクトリから一時保存ディレクトリへコピー)
Copy-Item $str_copy_from -destination $str_copy_to -recurse
 
# 一時保存ディレクトリ内のファイル・フォルダのリストを取得する。
$itemList = Get-ChildItem $str_copy_to;
foreach($item in $itemList)
{
    if($item.PSIsContainer)
    {
        # フォルダの場合の処理
        # 今回はなにもしない
    }
    else
    {
        # ファイルの場合の処理
        # ユーザー名取得
        $user = whoami
                
        # 一時保存ディレクトリにユーザー名+日付でフォルダを作成
        $newFolder = $str_copy_to + '\' + $user + '\' + (Get-Date).ToString("yyyyMMdd")
        mkdir $newFolder

        # 一時保存ディレクトリにコピー用ファイルを持っていきアップロード用フォルダ作成
        $temp = $str_copy_to + '\' + $item
        Move-Item $temp $newFolder -Force
        
        # フォルダごとアップロード  (フォルダアップロードの場合は末尾に[--recursive=true]を入れる)
        azcopy copy $str_copy_to "https://*********************vA%3D" --recursive=true
        
    }
} 

# 後片付け
Remove-Item -Path $str_copy_to -Recurse

:four_leaf_clover:
スクリプトの実行権限に要注意
Windowsのデフォルト設定だと ps スクリプトを実行する権限が備わっていません。そのため、次のコマンドを使って ps スクリプトを実行する権限を付けておきます。

PS> Set-ExecutionPolicy RemoteSigned

4. タスクスケジューラによる定期実行

[タスクの作成]をクリックし、
03.0.jpg

[全般]タブでタスクに名前をつけます。この時、「最上位の特権で実行する(I)」にチェック。
03.1.jpg

[トリガー]タブでジョブの開始時間、繰り返し間隔、継続時間等を変更
(以下の設定では、5分間隔に設定してます)
03.2.jpg

[操作]タブで実行プログラムを設定
この時、「プログラム/スクリプト(P):」にはPowerShell.exeを指定します。
(%Systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe)
「引数の追加(オプション)(A):」には実行するスクリプトを次のように指定「-Command ".\blobtest.ps1"」
「開始(オプション)(T):」には実行するスクリプトのパスを指定
03.3.jpg

[設定]タブで「タスクを停止するまでの時間(K):」が設定されているので、これをオフ
03.4.jpg

おまけ

直近変更のあったファイルだけを対象にアップロードしたい場合には、PowerShell スクリプトの中でLastwritetime コマンドレットを使って対象ファイルを抽出&アップロードを実行すれば良さそうですね。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?