Azure Data Lake Storage で Node.js の JavaScript SDK を使用して ACL を管理する
この記事では、Node.js を使用して、ディレクトリとファイルのアクセス制御リストを取得、設定、更新する方法について説明します。
パッケージ (ノード パッケージ マネージャー) | サンプル | フィードバックを送る
前提条件
- Azure サブスクリプション - 無料アカウントを作成します。
- 階層型名前空間 (HNS) が有効になっている Azure ストレージ アカウント。 作成するには、こちらの手順に従います。
- Node.js LTS
- Azure CLI バージョン
2.6.0
以上。 - 次のセキュリティのアクセス許可のいずれか。
- ターゲット コンテナー、ストレージ アカウント、親リソース グループ、またはサブスクリプションのスコープでストレージ BLOB データ所有者ロールが割り当てられた、プロビジョニングされた Microsoft Entra ID セキュリティ プリンシパル。
- ACL 設定を適用する予定のターゲット コンテナーまたはディレクトリの所有ユーザー。 ACL を再帰的に設定する場合、これには、ターゲット コンテナーまたはディレクトリ内のすべての子項目が含まれます。
- ストレージ アカウント キー。
プロジェクトの設定
このセクションでは、JavaScript 用 Azure Data Lake Storage クライアント ライブラリを操作するプロジェクトの準備について説明します。
パッケージをインストールする
npm install
コマンドを使用して、Azure Data Lake Storage と Azure ID クライアント ライブラリのパッケージをインストールします。 Azure サービスのパスワードレスの接続には、@azure/identity パッケージが必要です。
npm install @azure/storage-file-datalake
npm install @azure/identity
モジュールの読み込み
ファイルの先頭に次のコードを追加して、必要なモジュールを読み込みます。
const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");
const { DefaultAzureCredential } = require('@azure/identity');
アカウントに接続する
この記事のコード例を実行するには、ストレージ アカウントを表す DataLakeServiceClient インスタンスを作成する必要があります。 Microsoft Entra ID の資格情報またはアカウント キーを使用してクライアント オブジェクトを認可できます。
JavaScript 用 Azure ID クライアント ライブラリを使用して、Microsoft Entra ID でアプリケーションを認証できます。
Note
Microsoft Entra ID を使用してアクセスを認可している場合は、セキュリティ プリンシパルにストレージ BLOB データ所有者ロールが割り当てられていることを確認します。 ACL アクセス許可の適用方法とその変更による影響の詳細については、「Azure Data Lake Storage のアクセス制御モデル」を参照してください。
まず、次のいずれかのAzure ロールベースのアクセス制御 (Azure RBAC) ロールをセキュリティ プリンシパルに割り当てる必要があります。
Role | ACL 設定機能 |
---|---|
ストレージ BLOB データ所有者 | アカウント内のすべてのディレクトリとファイル。 |
ストレージ BLOB データ共同作成者 | セキュリティ プリンシパルによって所有されているディレクトリとファイルのみ。 |
次に、DataLakeServiceClient インスタンスを作成し、DefaultAzureCredential クラスの新しいインスタンスを渡します。
function GetDataLakeServiceClientAD(accountName) {
const dataLakeServiceClient = new DataLakeServiceClient(
`https://${accountName}.dfs.core.windows.net`,
new DefaultAzureCredential()
);
return dataLakeServiceClient;
}
DefaultAzureCredential
を使用してデータへのアクセスを認可する方法の詳細については、「概要: Azure SDK を使用した JavaScript アプリの Azure への認証」を参照してください。
ディレクトリの ACL を取得して設定する
この例では、my-directory
という名前のディレクトリの ACL を取得して設定します。 この例では、所有ユーザーには読み取り、書き込み、実行のアクセス許可を付与し、所有グループには読み取りと実行のアクセス許可のみを付与し、他のすべてのユーザーには読み取りアクセスを付与します。
Note
アプリケーションが Microsoft Entra ID を使用してアクセスを承認する場合は、アプリケーションがアクセスの承認に使用するセキュリティ プリンシパルに、 Storage BLOB データ所有者ロールが割り当てられていることを確認します。 ACL アクセス許可の適用方法とその変更による影響の詳細については、Azure Data Lake Storage のアクセス制御に関するページを参照してください。
async function ManageDirectoryACLs(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
const permissions = await directoryClient.getAccessControl();
console.log(permissions.acl);
const acl = [
{
accessControlType: "user",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: true,
execute: true
}
},
{
accessControlType: "group",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: false,
execute: true
}
},
{
accessControlType: "other",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: true,
execute: false
}
}
];
await directoryClient.setAccessControl(acl);
}
また、コンテナのルート ディレクトリの ACL を取得して設定することもできます。 ルート ディレクトリを取得するには、DataLakeFileSystemClient.getDirectoryClient メソッドに空の文字列 (/
) を渡します。
ファイルの ACL を取得して設定する
この例では、upload-file.txt
という名前のファイルの ACL を取得して設定します。 この例では、所有ユーザーには読み取り、書き込み、実行のアクセス許可を付与し、所有グループには読み取りと実行のアクセス許可のみを付与し、他のすべてのユーザーには読み取りアクセスを付与します。
Note
アプリケーションが Microsoft Entra ID を使用してアクセスを承認する場合は、アプリケーションがアクセスの承認に使用するセキュリティ プリンシパルに、 Storage BLOB データ所有者ロールが割り当てられていることを確認します。 ACL アクセス許可の適用方法とその変更による影響の詳細については、Azure Data Lake Storage のアクセス制御に関するページを参照してください。
async function ManageFileACLs(fileSystemClient) {
const fileClient = fileSystemClient.getFileClient("my-directory/uploaded-file.txt");
const permissions = await fileClient.getAccessControl();
console.log(permissions.acl);
const acl = [
{
accessControlType: "user",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: true,
execute: true
}
},
{
accessControlType: "group",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: false,
execute: true
}
},
{
accessControlType: "other",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: true,
execute: false
}
}
];
await fileClient.setAccessControl(acl);
}