Node.js の JavaScript SDK を使用して Azure Data Lake Storage でディレクトリとファイルを管理する
この記事では、階層型名前空間が有効になっているストレージ アカウントで、Node.js を使用してディレクトリとファイルを作成および管理する方法を示します。
ディレクトリとファイルのアクセス制御リスト (ACL) を取得、設定、更新する方法については、Azure Data Lake Storage での Node.js の JavaScript SDK を使用した ACL の管理に関する記事を参照してください。
パッケージ (ノード パッケージ マネージャー) | サンプル | フィードバックを送る
前提条件
Azure サブスクリプション。 詳細については、Azure 無料試用版の取得に関するページを参照してください。
階層型名前空間が有効になっているストレージ アカウント。 作成するには、こちらの手順に従います。
このパッケージを Node.js アプリケーションで使用する予定の場合、Node.js 8.0.0 以降が必要です。
プロジェクトの設定
ターミナル ウィンドウを開いてから次のコマンドを入力して、JavaScript 用の Data Lake クライアント ライブラリをインストールします。
npm install @azure/storage-file-datalake
このステートメントをコード ファイルの先頭に配置して、storage-file-datalake
パッケージをインポートします。
const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");
Note
Data Lake Storage のマルチプロトコル アクセスでは、アプリケーションは BLOB API と Data Lake Storage Gen2 API の両方を使用して、階層型名前空間 (HNS) が有効なストレージ アカウント内のデータを操作できます。 ディレクトリ操作や ACL など、Data Lake Storage Gen2 に固有の機能を使用する場合は、この記事に示すように Data Lake Storage Gen2 API を使用します。
特定のシナリオで使用する API を選択する場合は、ワークロードとアプリケーションのニーズを、既知の問題や HNS がワークロードとアプリケーションに与える影響と一緒に考慮してください。
アカウントに接続する
この記事のスニペットを使用するには、ストレージ アカウントを表す DataLakeServiceClient インスタンスを作成する必要があります。
Microsoft Entra ID を使用して接続する
JS 用 Azure ID クライアント ライブラリを使って、Microsoft Entra ID でアプリケーションを認証できます。
DataLakeServiceClient インスタンスを作成し、DefaultAzureCredential クラスの新しいインスタンスを渡します。
function GetDataLakeServiceClientAD(accountName) {
const dataLakeServiceClient = new DataLakeServiceClient(
`https://${accountName}.dfs.core.windows.net`,
new DefaultAzureCredential());
return dataLakeServiceClient;
}
DefaultAzureCredential を使用してデータへのアクセスを承認する方法の詳細については、「概要: Azure SDK を使用した JavaScript アプリの Azure への認証」を参照してください。
アカウント キーを使用して接続する
アカウント アクセス キー (共有キー) を使用して、データへのアクセスを承認できます。 この例では、アカウント キーで承認された DataLakeServiceClient インスタンスを作成します。
function GetDataLakeServiceClient(accountName, accountKey) {
const sharedKeyCredential =
new StorageSharedKeyCredential(accountName, accountKey);
const dataLakeServiceClient = new DataLakeServiceClient(
`https://${accountName}.dfs.core.windows.net`, sharedKeyCredential);
return dataLakeServiceClient;
}
この承認方法は、Node.js アプリケーションに対してのみ機能します。 ブラウザーでコードを実行する予定の場合、Microsoft Entra ID を使用して認可できます。
注意事項
共有キーを使用した承認は、安全性が低い可能性があるため、お勧めしません。 最適なセキュリティを確保するには、「Azure Storage アカウントの共有キーによる承認を禁止する」の説明に従って、ストレージ アカウントの共有キーによる承認を無効にします。
アクセス キーと接続文字列の使用は、運用環境や機密データにアクセスしない概念実証アプリまたは開発プロトタイプに限定する必要があります。 それ以外の場合は、Azure リソースに対する認証時に、Azure SDK で使用できるトークンベースの認証クラスを常に優先する必要があります。
Microsoft は、クライアントが Microsoft Entra ID または Shared Access Signature (SAS) を使って、Azure Storage 内のデータへのアクセスを認可することをお勧めします。 詳細については、「Azure Storage 内のデータへのアクセスを承認する」を参照してください。
コンテナーを作成する
コンテナーは、ファイルのファイル システムとして機能します。 これは、FileSystemClient インスタンスを取得し、次に FileSystemClient.Create メソッドを呼び出すことで作成できます。
この例では、my-file-system
という名前のコンテナーを作成します。
async function CreateFileSystem(dataLakeServiceClient) {
const fileSystemName = "my-file-system";
const fileSystemClient = dataLakeServiceClient.getFileSystemClient(fileSystemName);
const createResponse = await fileSystemClient.create();
}
ディレクトリを作成する
ディレクトリ参照は、DirectoryClient インスタンスを取得し、次に DirectoryClient.create メソッドを呼び出すことによって作成します。
この例では、my-directory
という名前のディレクトリをコンテナーに追加します。
async function CreateDirectory(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
await directoryClient.create();
}
ディレクトリの名前変更または移動
DirectoryClient.rename メソッドを呼び出して、ディレクトリの名前変更または移動を行います。 目的のディレクトリのパスをパラメーターに渡します。
この例では、サブディレクトリの名前を my-directory-renamed
に変更します。
async function RenameDirectory(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
await directoryClient.move("my-directory-renamed");
}
この例では、my-directory-renamed
という名前のディレクトリを my-directory-2
という名前のディレクトリのサブディレクトリに移動します。
async function MoveDirectory(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory-renamed");
await directoryClient.move("my-directory-2/my-directory-renamed");
}
ディレクトリを削除する
DirectoryClient.delete メソッドを呼び出して、ディレクトリを削除します。
この例では、my-directory
という名前のディレクトリを削除します。
async function DeleteDirectory(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
await directoryClient.delete();
}
ファイルをディレクトリにアップロードする
まず、ファイルを読み取ります。 この例では、Node.js fs
モジュールを使用しています。 次に、FileClient インスタンスを作成してから FileClient.create メソッドを呼び出して、ターゲット ディレクトリ内にファイル参照を作成します。 FileClient.append メソッドを呼び出して、ファイルをアップロードします。 FileClient.flush メソッドを呼び出して、アップロードの完了を確認します。
この例では、my-directory
という名前のディレクトリにテキスト ファイルをアップロードします。
async function UploadFile(fileSystemClient) {
const fs = require('fs')
var content = "";
fs.readFile('mytestfile.txt', (err, data) => {
if (err) throw err;
content = data.toString();
})
const fileClient = fileSystemClient.getFileClient("my-directory/uploaded-file.txt");
await fileClient.create();
await fileClient.append(content, 0, content.length);
await fileClient.flush(content.length);
}
ディレクトリからダウンロードする
まず、ダウンロードするファイルを表す FileSystemClient インスタンスを作成します。 FileSystemClient.read メソッドを使用してファイルを読み取ります。 次に、ファイルを書き込みます。 この例では、Node.js fs
モジュールを使用してそれを行います。
Note
このファイル ダウンロード方法は、Node.js アプリケーションに対してのみ機能します。 ブラウザーでコードを実行する予定の場合は、JavaScript 用の Azure Storage ファイル Data Lake クライアント ライブラリの Readme ファイルで、ブラウザーでこれを行う方法の例を参照してください。
async function DownloadFile(fileSystemClient) {
const fileClient = fileSystemClient.getFileClient("my-directory/uploaded-file.txt");
const downloadResponse = await fileClient.read();
const downloaded = await streamToString(downloadResponse.readableStreamBody);
async function streamToString(readableStream) {
return new Promise((resolve, reject) => {
const chunks = [];
readableStream.on("data", (data) => {
chunks.push(data.toString());
});
readableStream.on("end", () => {
resolve(chunks.join(""));
});
readableStream.on("error", reject);
});
}
const fs = require('fs');
fs.writeFile('mytestfiledownloaded.txt', downloaded, (err) => {
if (err) throw err;
});
}
ディレクトリの内容を一覧表示する
この例では、my-directory
という名前のディレクトリにある、それぞれのディレクトリおよびファイルの名前を出力します。
async function ListFilesInDirectory(fileSystemClient) {
let i = 1;
let iter = await fileSystemClient.listPaths({path: "my-directory", recursive: true});
for await (const path of iter) {
console.log(`Path ${i++}: ${path.name}, is directory: ${path.isDirectory}`);
}
}