我正在开发一个企业业务项目,需要将应用程序从本地迁移到 Azure 云。
某些应用程序需要 Azure Blob 存储。所有 Azure 云基础设施都可以使用 Manage Identity 进行访问,业务要求是在无法访问 Azure 门户的情况下测试和验证 Azure Blob 方法,开发人员只能访问任何非生产或生产的存储资源。也就是说,该公司要求我们在将代码推送到云之前通过在本地和 GitHub 工作流程上进行测试来使所有存储功能正常工作。
当然,我可以启动我的个人 Azure 帐户并使用它,但仍然会使用我的帐户作为游乐场进行测试,但并不是真正可用的测试。
通用测试 Azure Blob 存储的整个想法,无需对 Blob 存储有任何类型的访问权限。
这可能吗?我怎样才能实现这一目标?
以下是我针对 Azure Blob 的工作 POC 方法:
private readonly BlobContainerClient _blobContainerClient;
public AzureBlobStorage(string connectionString, string container)
{
_blobContainerClient = new BlobContainerClient(connectionString, container);
_blobContainerClient.CreateIfNotExists();
}
public async Task<string> ReadTextFile(string filename)
{
var blob = _blobContainerClient.GetBlobClient(filename);
if (!await _blobContainerClient.ExistsAsync()) return string.Empty;
var reading = await blob.DownloadStreamingAsync();
StreamReader reader = new StreamReader(reading.Value.Content);
return await reader.ReadToEndAsync(); …Run Code Online (Sandbox Code Playgroud) 我的应用程序允许用户输入 Azure Blob 存储 SAS URL。我将如何去验证它?我正在使用Azure 存储 Blob 客户端库,并且似乎没有任何方法可以在不实际执行 Blob 操作(我不想这样做)的情况下验证 SAS URL。
验证操作可以是异步的,并在必要时涉及 API 调用(即可以通过按钮触发)。
public class SASURLValidator
{
public async Task<bool> ValidateSASURL(string sasURL)
{
// What goes here?
}
public async Task Test()
{
var result = await ValidateSASURL("https://blobstorageaccountname.blob.core.windows.net/containerName?sp=w&st=2022-02-15T02:07:49Z&se=2022-03-15T10:07:49Z&spr=https&sv=2020-08-04&sr=c&sig=JDFJEF342JDSFJIERJsdjfkajiwSKDFJIQWJIFJSKDFJWE%3D")
// result should be true if the above is a valid SAS
}
}
Run Code Online (Sandbox Code Playgroud) .net c# azure-storage azure-blob-storage shared-access-signatures
使用arm模板,我能够创建存储帐户、队列、文件服务。但是当我也尝试创建容器时,azure devops 任务失败。
"resources": [
{
"name": "[parameters('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-08-01",
"location": "[parameters('location')]",
"properties": {
"accessTier": "[parameters('accessTier')]",
"minimumTlsVersion": "TLS1_2",
"supportsHttpsTrafficOnly": true,
"allowBlobPublicAccess": true,
"allowSharedKeyAccess": true,
"allowCrossTenantReplication": true,
"defaultToOAuthAuthentication": false,
"networkAcls": {
"bypass": "AzureServices",
"defaultAction": "Allow",
"ipRules": []
},
"isHnsEnabled": "[parameters('isHnsEnabled')]"
},
"dependsOn": [],
"sku": {
"name": "[parameters('accountType')]"
},
"kind": "[parameters('kind')]",
"tags": {
"InstanceId": "[parameters('instanceId')]"
}
},
{
"name": "[concat(parameters('storageAccountName'), '/default')]",
"type": "Microsoft.Storage/storageAccounts/blobServices",
"apiVersion": "2021-08-01",
"properties": {
"restorePolicy": {
"enabled": false
},
"deleteRetentionPolicy": {
"enabled": true,
"days": 7
},
"containerDeleteRetentionPolicy": …Run Code Online (Sandbox Code Playgroud) 在公共访问级别方面,Container和Blob有什么区别 ?(见下图蓝色框)
根据微软的定义:
容器组织一组 blob,类似于文件系统中的目录。存储帐户可以包含无限数量的容器,并且容器可以存储无限数量的 Blob。
但我不明白这与公共访问级别有什么关系。
通过 powershell 创建 SASToken 时,它会从 New-AzureStorageContainerSASToken comdlet 返回创建的 SAS 令牌 URL。
$Context = New-AzureStorageContext -StorageAccountName $StorageAccount -StorageAccountKey $StorageAccountKey
$now = Get-Date
$sasUrl = New-AzureStorageContainerSASToken -Name mycontainer -Permission rwdl -StartTime $now.AddHours(-1) -ExpiryTime $now.AddMonths(1) -Context $context -FullUri
echo $sasUrl
Run Code Online (Sandbox Code Playgroud)
但是现在万一我丢失了它,我该如何列出现有的 SASToken?您可能在同一个容器上有几个。
尝试了 Get-AzureStorageContainer,但此信息不可用。
与其他 Get-AzureStorage* 一起玩,但未能找到它。
是否通过 powershell 支持此操作?
powershell azure azure-storage azure-powershell azure-blob-storage
作为安全产品的一部分,我拥有大规模云服务(azure worker 角色),它从事件中心读取事件,将它们分批处理到 ~2000 并存储在 blob 存储中。每个事件都有一个 MachineId(发送它的机器)。事件以随机顺序来自事件中心,我以随机顺序将它们存储在 blob 存储中。吞吐量高达 125K 事件/秒,每个事件约为 2K,因此我们有高达 250MB/秒的流量。我们有大约 100 万台机器...
稍后,另一个云服务下载 blob 并对事件运行一些检测逻辑。他按 MachineId 对事件进行分组,并尝试从机器时间线中了解某些内容
问题是今天来自同一台机器的事件被填充到不同的 blob。如果我可以通过它们的 MachineId 以某种方式对事件进行分组,并确保机器的某个时间窗口填充到相同的 blob,这将增加我可以在云中进行的检测。
我们确实将事件写入另一个 Map reduce 系统,并且在那里我们正在做很多复杂的检测,但那些当然具有高延迟。如果我可以在云中更好地对事件进行分组,我就可以实时捕获更多信息
我有什么技术可以帮助我吗?
提前致谢
我已经设置了一个逻辑应用程序来将我的FTP服务器上的新文件移动到我的azure存储容器中,该容器具有我的文件的blob.我找到了一种使用存储资源管理器创建新文件夹的方法,但有没有办法可以使用逻辑应用程序自动执行此操作?例如,如果在我的FTP中创建了一个新文件夹并添加了文件,我想创建一个blob文件夹并将这些文件移动到该blob中.
我正在尝试搜索与我的搜索模式匹配的文件。
static void ListBlobsInFolder() {
var account = <MyStorageAccount>
var blobClient = account.CreateCloudBlobClient();
var containerName = "importcontainer";
var folderName = "subfolder";
var container = blobClient.GetContainerReference(containerName);
var query = container.ListBlobs(prefix: folderName, useFlatBlobListing: true, blobListingDetails: BlobListingDetails.None);
foreach(var item in query) {
Console.WriteLine(item.Uri.Segments.Last());
}
}
Run Code Online (Sandbox Code Playgroud)
这让我得到子文件夹中存在的文件列表。
有没有办法返回只匹配模式的文件。示例我想检索其中包含“abc”的文件名。
这在 Azure 中可能吗?
我的 Windows 机器上的本地文件夹中有一些图像。我想将所有图像上传到同一个容器中的同一个 blob。
我知道如何使用Azure 存储 SDK 上传单个文件BlockBlobService.create_blob_from_path(),但我看不到一次上传文件夹中所有图像的可能性。
但是,Azure 存储资源管理器为此提供了一个功能,因此它必须以某种方式成为可能。
是否有提供此服务的功能,或者我是否必须遍历文件夹中的所有文件并create_blob_from_path()为同一个 blob 多次运行?
我必须更新存储为 Azure blob 的大文件。此更新将需要几秒钟,我需要确保没有其他客户端获得部分更新的文件。
如https://docs.microsoft.com/en-us/azure/storage/common/storage-concurrency 中所述,锁定文件进行写入应该很容易,但据我所知,其他客户端仍然可以读取文件。我可以使用读锁,但这意味着只有一个客户端可以读取文件,这不是我想要的。
根据防止 azure blob 在创建时被其他服务访问,似乎至少会在上传结束时“提交”新文件,但我找不到更新现有文件时会发生什么的信息。
所以,问题是:在更新(替换)操作期间其他客户端会读取什么?