準備
Kuduを使ってAzure SDK for Node.js をインストールしておく
参考
Azure Functionsで npmモジュールを使う
実装
var azure = require("azure");
//ここを書き換える
var storageAccount = "your-storage-account";
var storageAccessKey = "your-storage-access-key";
var container = "your-container-name";
//ここを書き換える
var blobService = azure.createBlobService(storageAccount, storageAccessKey);
function getSAS(context, blob) {
var startDate = new Date();
startDate.setMinutes(startDate.getMinutes() - 5 );
var expiryDate = new Date(startDate);
expiryDate.setMinutes(startDate.getMinutes() + 10);
context.log("blobService: " + JSON.stringify(blobService.host));
context.log("startDate: " + startDate.toISOString());
context.log("expiryDate: " + expiryDate.toISOString());
var sharedAccessPolicy = {
AccessPolicy: {
Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.READ,
Start: startDate.toISOString(),
Expiry: expiryDate.toISOString()
}
};
context.log(JSON.stringify(sharedAccessPolicy));
var signature = blobService.generateSharedAccessSignature(container, blob, sharedAccessPolicy);
console.log("signature: " + signature);
return signature;
}
module.exports = function(context, req) {
context.log("Node.js HTTP trigger function processed a request. RequestUri=%s", req.originalUrl);
var fileKey;
if (req.query.fileKey|| (req.body && req.body.fileKey)) {
fileKey = (req.query.fileKey || req.body.fileKey);
}
if (!fileKey) {
context.res = {
status: 400,
body: { result: "ng", error: "Please pass a fileKey on the query string or in the request body" }
};
context.done();
return;
}
var sas = getSAS(context, fileKey);
var url = blobService.getUrl(container,fileKey,sas);
console.log(url);
var responceBody = {
url: url
};
context.res = {
// status: 200, /* Defaults to 200 */
body: responceBody
};
context.done();
};
上記の例では、現在時刻の5分前 から 10分間有効なSASを発行している。
実行時の要求本文(例)
{
"fileKey": "sastestdir/sastestfile.txt"
}
アクセスポリシのパーミッションの複数指定
var sharedAccessPolicy = {
AccessPolicy: {
Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.READ + azure.Constants.BlobConstants.SharedAccessPermissions.LIST,
Start: startDate.toISOString(),
Expiry: expiryDate.toISOString()
}
};
.READは単純に文字列で"r"、.LISTは"l"なので
+で繋げて渡してやれば良い。
Permissionsを変更すると、クエリストリングのspが sp=rになったり、sp=rl になったりするので、
urlを見て確認できる。
何か間違ってたり、もっとこうしたほうがいいよなどあれば是非コメントにて指摘、アドバイスください