NEWSニュース&ブログ

【ADLS Gen2】特定の文字列を含むファイルに絞り込むコピー作業を自動化してみた

この記事は最終更新から1年以上経過しています。内容が古くなっている可能性があります。

投稿日:2024/02/05

背景

先日、Azure Data Lake Gen2(以下、ADLS Gen2と記載)にデータベースに取り込み済みのRowデータを保存しているのだが、リカバリ作業が発生し、コンテナ内のrecoveryフォルダに特定のファイルをコピーして対応しなければいけないといったことが発生しました。

しかし、yyyy-mm-dd配下の特定ファイルに対して一つ一つ手動でコピーを行わなければならず、それだけでもかなりの工数となってしまうため自動化できないかといった要望を頂きました。

問題への対応

PowerShellスクリプトを作成し、ADLS Gen2のファイル移動の自動化を実現することができました。

手順

まず初めに前提条件を記載します。

 ・Azure CLIが実行できる環境であること

 ・az login でログイン済みであること

 ・変数に任意の値を設定していること


次に作成したスクリプトの概要の説明です。

 ① ストレージアカウントキーを取得

 ② ファイル名に 変数「fileContains」 が含まれ、変数「fileExtension」であるかチェック

 ③ コピー先のBlob名として、変数「destinationPrefix」を設定

 ④ ファイル移動の確認を行う


それでは実際に検証してみましょう。

スクリプトの変数は下記のようなものを設定しました。

### 前提:az loginが行われている事
# 変数を設定
$storageAccountName="test01"
$containerName="test-container-01"
$sourcePrefix="/"
$destinationPrefix="recovery_data/"
$fileContains="test01"
$fileExtension=".txt"
# ストレージアカウントキーを取得
$accountKey=(az storage account keys list --account-name $storageAccountName --query '[0].value' -o tsv)
# 移行元のBlobをリストし、条件に一致するものをコピー
$blobs=(az storage blob list --account-name $storageAccountName --account-key $accountKey --container-name $containerName --prefix $sourcePrefix --query "[].name" -o tsv)
foreach ($blob in $blobs)
{
  # ファイル名に '検索文字列' が含まれ、.拡張子ファイルであるかチェック
  $fileName = Split-Path $blob -Leaf
  if ($fileName -match "$fileContains.*$fileExtension$")
  {
    # コピー先のBlob名を設定
    $destinationBlobName=$destinationPrefix + $fileName
    # Blobをコピー
    az storage blob copy start --account-name $storageAccountName --account-key $accountKey --destination-blob $destinationBlobName --destination-container $containerName --source-uri ("https://" + $storageAccountName + ".blob.core.windows.net/" + $containerName + "/" + $blob)
    Write-Host "Copying $blob to $destinationBlobName"
  }
}
Write-Host "Blob copy operation completed."

ADLS Gen2内のtest-container-01内はこのような状態になっています。

実際のフォルダの中身を確認してみましょう。

例えば2024-01-20は以下のファイルが格納されています。


2024-01-21も日付情報以外は上記と同様のファイル名で格納されています。


ファイルのコピー先であるrecoveryフォルダには使用できるデータがないことを確認できました。


それでは、前提条件の一つである az loginを実行します。


準備が整いましたので、スクリプトを実行してみます。

Windows PowerShell ISEを開き、スクリプトを貼り付けて実行しましょう。


「Blob copy operation completed」と表示されましたので、エラーは発生していないようです。

recoveryフォルダの中身はどうでしょうか。


想定通り、test-container-01内に存在する「test01」の文字列を含むファイルのみコピーが行われていますね。

検証結果

ADLS Gen2内のフォルダ間のファイルコピーを自動化することで作業効率UPが図れるだけでなく、手作業による抜け漏れや誤った操作などを防止することもできそうです。

中川 智文(2022年入社)
株式会社システムサポート フューチャーイノベーション事業本部 ソリューションサービス事業部所属
Oracle Database, SQL Serverを中心とした案件に従事