Azure Data Lake Storage Gen2 で JavaScript (Node.js の SDK) を使用して ACL を管理する

この記事では、Node.js を使用して、ディレクトリとファイルのアクセス制御リストを取得、設定、更新する方法について説明します。

パッケージ (ノード パッケージ マネージャー) | サンプル | フィードバックを送る

前提条件

  • Azure サブスクリプション。 詳細については、Azure 無料試用版の取得に関するページを参照してください。

  • 階層型名前空間 (HNS) が有効になっているストレージ アカウント。 作成するには、こちらの手順に従います。

  • Azure CLI バージョン 2.6.0 以上。

  • 次のセキュリティのアクセス許可のいずれか。

    • ターゲット コンテナー、ストレージ アカウント、親リソース グループ、またはサブスクリプションのスコープでストレージ BLOB データ所有者ロールが割り当てられた、プロビジョニングされた Microsoft Entra ID セキュリティ プリンシパル

    • ACL 設定を適用する予定のターゲット コンテナーまたはディレクトリの所有ユーザー。 ACL を再帰的に設定する場合、これには、ターゲット コンテナーまたはディレクトリ内のすべての子項目が含まれます。

    • ストレージ アカウント キー。

プロジェクトの設定

ターミナル ウィンドウを開いてから次のコマンドを入力して、JavaScript 用の Data Lake クライアント ライブラリをインストールします。

npm install @azure/storage-file-datalake

このステートメントをコード ファイルの先頭に配置して、storage-file-datalake パッケージをインポートします。

const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");

アカウントに接続する

この記事のスニペットを使用するには、ストレージ アカウントを表す DataLakeServiceClient インスタンスを作成する必要があります。

Microsoft Entra ID を使用して接続する

Note

Microsoft Entra ID を使用してアクセスを承認している場合は、セキュリティ プリンシパルに ストレージ BLOB データ所有者ロールが割り当てられていることを確認してください。 ACL アクセス許可の適用方法とその変更による影響の詳細については、「Azure Data Lake Storage Gen2 のアクセス制御モデル」を参照してください。

JS 用の Azure ID クライアント ライブラリを使用して、Microsoft Entra ID でアプリケーションを認証できます。

まず、次のいずれかの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 への認証」を参照してください。

アカウント キーを使用して接続する

アカウント アクセス キー (共有キー) を使用して、データへのアクセスを承認できます。 この例では、アカウント キーで承認された DataLakeServiceClient インスタンスを作成します。


function GetDataLakeServiceClient(accountName, accountKey) {

  const sharedKeyCredential =
     new StorageSharedKeyCredential(accountName, accountKey);

  const dataLakeServiceClient = new DataLakeServiceClient(
      `https://${accountName}.dfs.core.windows.net`, sharedKeyCredential);

  return dataLakeServiceClient;
}

注意事項

共有キーを使用した承認は、安全性が低い可能性があるため、お勧めしません。 最適なセキュリティを確保するには、「Azure Storage アカウントの共有キーによる承認を禁止する」の説明に従って、ストレージ アカウントの共有キーによる承認を無効にします。

アクセス キーと接続文字列の使用は、運用環境や機密データにアクセスしない概念実証アプリまたは開発プロトタイプに限定する必要があります。 それ以外の場合は、Azure リソースに対する認証時に、Azure SDK で使用できるトークンベースの認証クラスを常に優先する必要があります。

Microsoft は、クライアントが Microsoft Entra ID または Shared Access Signature (SAS) を使って、Azure Storage 内のデータへのアクセスを認可することをお勧めします。 詳細については、「Azure Storage 内のデータへのアクセスを承認する」を参照してください。

ディレクトリの ACL を取得して設定する

この例では、my-directory という名前のディレクトリの ACL を取得して設定します。 この例では、所有ユーザーには読み取り、書き込み、実行のアクセス許可を付与し、所有グループには読み取りと実行のアクセス許可のみを付与し、他のすべてのユーザーには読み取りアクセスを付与します。

Note

アプリケーションが Microsoft Entra ID を使用してアクセスを承認する場合は、アプリケーションがアクセスの承認に使用するセキュリティ プリンシパルに、 Storage BLOB データ所有者ロールが割り当てられていることを確認します。 ACL アクセス許可の適用方法とその変更による影響の詳細については、Azure Data Lake Storage Gen2 のアクセス制御に関するページを参照してください。

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 Gen2 のアクセス制御に関するページを参照してください。

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);
}

関連項目