Azure Blob Storage と JavaScript でアカウント SAS トークンを作成して使用する

この記事では、アカウント SAS トークンを作成して使用し、JavaScript 用の Azure Blob Storage クライアント ライブラリ v12 を使用する方法について説明します。 接続されると、コードは、Blob Storage サービスのコンテナー、BLOB、機能を使って動作できます。

実行可能な Node.js ファイルとして GitHub からサンプル コード スニペットを入手できます。

パッケージ (npm) | サンプル | API リファレンス | ライブラリ ソース コード | フィードバックを送る

アカウント SAS トークン

アカウント SAS トークンは、Azure Storage によって提供されるアクセス委任用の SAS トークンの種類の 1 つです。 アカウント SAS トークンは、Azure Storage へのアクセスを提供します。 トークンは、作成時に定義したとおりにのみ制限されます。 トークンを持つすべてのユーザーがストレージ アカウントにアクセスできるため、トークンが必要なタスクを完了できるように、最も制限の厳しいアクセス許可でトークンを定義する必要があります。

トークン作成のベスト プラクティスには、アクセス許可の制限が含まれます。

  • サービス: BLOB、ファイル、キュー、テーブル
  • リソースの種類: サービス、コンテナー、またはオブジェクト
  • 作成、読み取り、書き込み、更新、削除などのアクセス許可

必要な依存関係をアプリケーションに追加する

アカウント SAS トークンを作成するために必要な依存関係を含めます。

const { 
    BlobServiceClient, 
    generateAccountSASQueryParameters, 
    AccountSASPermissions, 
    AccountSASServices,
    AccountSASResourceTypes,
    StorageSharedKeyCredential,
    SASProtocol 
} = require('@azure/storage-blob');
require('dotenv').config()

環境変数を取得して共有キー資格情報を作成する

Blob Storage アカウント名とキーを使用して StorageSharedKeyCredential を作成します。 このキーは、SAS トークンを作成し、SAS トークンを使用するために必要です。

ストレージ アカウント名とアカウント キーを使って、StorageSharedKeyCredential を作成します。 その後、StorageSharedKeyCredential を使って BlobServiceClient を初期化します。

const constants = {
    accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME,
    accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY
};
const sharedKeyCredential = new StorageSharedKeyCredential(
    constants.accountName,
    constants.accountKey
);

非同期操作の定型

残りのサンプル コード スニペットでは、Node.js 用に次の非同期定型コードを想定しています。

async function main() {

    const sasToken = await createAccountSas();

    await useSasToken(sasToken);
}

main()
    .then(() => {
        console.log(`done`);
    }).catch((ex) => {
        console.log(`Error: ${ex.message}`)
    });

SAS トークンを作成する

このトークンは BLOB、キュー、テーブル、ファイルと共に使用できるため、一部の設定は BLOB オプションよりも広範になります。

  1. オプション オブジェクトを作成します。

    SAS トークンの機能のスコープは、AccountSASSignatureValues によって定義されます。

    SDK によって提供される次のヘルパー関数を使用して、値の正しい値の型を作成します。

  2. オブジェクトを SharedKeyCredential と共に generateAccountSASQueryParameters 関数に渡して、SAS トークンを作成します。

    SAS トークンを返す前に、クエリ文字列区切り記号 ? を先頭に追加します。

    async function createAccountSas() {
    
        const sasOptions = {
    
            services: AccountSASServices.parse("btqf").toString(),          // blobs, tables, queues, files
            resourceTypes: AccountSASResourceTypes.parse("sco").toString(), // service, container, object
            permissions: AccountSASPermissions.parse("rwdlacupi"),          // permissions
            protocol: SASProtocol.Https,
            startsOn: new Date(),
            expiresOn: new Date(new Date().valueOf() + (10 * 60 * 1000)),   // 10 minutes
        };
    
        const sasToken = generateAccountSASQueryParameters(
            sasOptions,
            sharedKeyCredential 
        ).toString();
    
        console.log(`sasToken = '${sasToken}'\n`);
    
        // prepend sasToken with `?`
        return (sasToken[0] === '?') ? sasToken : `?${sasToken}`;
    }
    
  3. SAS トークンが使用されるまで、SAS トークンをセキュリティで保護します。

アカウント SAS トークンで Blob service を使用する

アカウント SAS トークンを使用するには、アカウント名と組み合わせて URI を作成する必要があります。 URI を渡して blobServiceClient を作成します。 blobServiceClient を取得したら、そのクライアントを使用して Blob service にアクセスできます。

// connect-with-sas-token.js
const { BlobServiceClient } = require('@azure/storage-blob');
require('dotenv').config()

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
const sasToken = process.env.AZURE_STORAGE_SAS_TOKEN;
if (!accountName) throw Error('Azure Storage accountName not found');
if (!sasToken) throw Error('Azure Storage accountKey not found');

const blobServiceUri = `https://${accountName}.blob.core.windows.net`;

// https://YOUR-RESOURCE-NAME.blob.core.windows.net?YOUR-SAS-TOKEN
const blobServiceClient = new BlobServiceClient(
  `${blobServiceUri}?${sasToken}`,
  null
);

async function main(){
  
  const containerName = 'REPLACE-WITH-EXISTING-CONTAINER-NAME';
  const blobName = 'REPLACE-WITH-EXISTING-BLOB-NAME';

  const timestamp = Date.now();
  const fileName = `my-new-file-${timestamp}.txt`;

  // create container client
  const containerClient = await blobServiceClient.getContainerClient(containerName);

  // create blob client
  const blobClient = await containerClient.getBlockBlobClient(blobName);

  // download file
  await blobClient.downloadToFile(fileName);

  console.log(`${fileName} downloaded`);
  
}

main()
  .then(() => console.log(`done`))
  .catch((ex) => console.log(`error: ${ex.message}`));

dotenv パッケージは、.env ファイルからストレージ アカウント名を読み取るために使用されます。 このファイルをソース コード管理にチェックインすることはしないでください。

関連項目