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 オプションよりも広範になります。
オプション オブジェクトを作成します。
SAS トークンの機能のスコープは、AccountSASSignatureValues によって定義されます。
SDK によって提供される次のヘルパー関数を使用して、値の正しい値の型を作成します。
- AccountSASServices.parse("btqf").toString():
- b: BLOB
- t: テーブル
- q: クエリ
- f: ファイル
- resourceTypes: AccountSASResourceTypes.parse("sco").toString()
- s: サービス
- c: コンテナー - BLOB コンテナー、テーブル、キューなど
- o: オブジェクト - BLOB、行、メッセージ
- permissions: AccountSASPermissions.parse("rwdlacupi")
- r: 読み取り
- w: 書き込み
- d: 削除
- l: リスト
- f: フィルター
- a: 追加
- c: 作成
- u: 更新
- t: タグ アクセス
- p: プロセス - キュー内のメッセージの処理など
- i: 不変性ポリシーの設定
- AccountSASServices.parse("btqf").toString():
オブジェクトを 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}`; }
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
ファイルからストレージ アカウント名を読み取るために使用されます。 このファイルをソース コード管理にチェックインすることはしないでください。