У меня есть это требование, чтобы получить сведения об учетной записи хранения и получить список больших двоичных объектов хранилища, отфильтрованных с помощью определенного «теста» контейнера. Я получил этот справочный код из stackoverflow, который выводит контейнер на основе значения тега. Я попытался добавить условие «if» в тот же сценарий для фильтрации сведений о контейнере, но это не дало никаких результатов, а также не знал, как составить список больших двоичных объектов в том же сценарии, отфильтрованном с помощью «теста» контейнера.
Я ожидаю, что сценарий выведет сведения об учетной записи хранения (отфильтрованные по тегам), размер учетной записи хранения, контейнер (отфильтрованный по конкретному контейнеру) и список больших двоичных объектов из отфильтрованных контейнеров.
Запросите более подробную информацию, если вышеизложенного недостаточно.
Connect-AzAccount -Tenant 'xxxxx' -UseDeviceAuthentication
# Get all subscriptions
$subscriptions = Get-AzSubscription
# Define the tag key to filter by
$tagKey = "any"
# Initialize an array to store the results
$results = @()
foreach ($subscription in $subscriptions) {
# Set the current subscription context
Set-AzContext -SubscriptionId $subscription.Id
# Get all storage accounts in the current subscription
$storageAccounts = Get-AzStorageAccount | Where-Object { $_.Tags.ContainsKey($tagKey) }
foreach ($storageAccount in $storageAccounts) {
# Get the metrics for the storage account
$resourceId = "/subscriptions/$($subscription.Id)/resourceGroups/$($storageAccount.ResourceGroupName)/providers/Microsoft.Storage/storageAccounts/$($storageAccount.StorageAccountName)"
$uri = "https://management.azure.com$resourceId/providers/Microsoft.Insights/metrics?api-version=2023-10-01&metricnames=UsedCapacity&aggregation=Average"
try {
$response = Invoke-AzRestMethod -Method Get -Uri $uri
$metrics = $response.Content | ConvertFrom-Json
$usedCapacityMetric = $metrics.value | Where-Object { $_.name.value -eq "UsedCapacity" }
if ($usedCapacityMetric) {
$averageCapacity = $usedCapacityMetric.timeseries.data.average | Measure-Object -Sum | Select-Object -ExpandProperty Sum
} else {
$averageCapacity = 0
}
} catch {
Write-Warning "Failed to retrieve metrics for storage account: $($storageAccount.StorageAccountName)"
$averageCapacity = 0
}
$ctx = $storageAccount.Context
$containers = Get-AzStorageContainer -Context $ctx
foreach ($container in $containers) {
if ($container.Name -eq "test") {
$results += [PSCustomObject]@{
#SubscriptionId = $subscription.Id
SubscriptionName = $subscription.Name
ResourceGroup = $storageAccount.ResourceGroupName
StorageAccount = $storageAccount.StorageAccountName
ContainerName = $container.Name
UsedCapacityInBytes = $averageCapacity
TagName = $tagKey
TagValue = $storageAccount.Tags[$tagKey]
}
}
}
}
}
# Output the results
$results | Format-Table -AutoSize
Я ожидаю, что сценарий выведет сведения об учетной записи хранения (отфильтрованные по тегам), размер учетной записи хранения, контейнер (отфильтрованный по конкретному контейнеру) и список больших двоичных объектов из отфильтрованных контейнеров.
Вы можете использовать приведенный ниже скрипт, чтобы получить storage account details (filtered by tags)
, storage account size
, container(filtered by specific container)
и list blobs
из отфильтрованных контейнеров.
Скрипт:
Connect-AzAccount -Tenant 'xxxxx' -UseDeviceAuthentication
# Get all subscriptions
$subscriptions = Get-AzSubscription
# Define the tag key to filter by
$tagKey = "createdby"
# Initialize an array to store the results
$results = @()
foreach ($subscription in $subscriptions) {
# Set the current subscription context
Set-AzContext -SubscriptionId $subscription.Id
# Get all storage accounts in the current subscription
$storageAccounts = Get-AzStorageAccount | Where-Object { $_.Tags.ContainsKey($tagKey) }
foreach ($storageAccount in $storageAccounts) {
# Get the metrics for the storage account
$resourceId = "/subscriptions/$($subscription.Id)/resourceGroups/$($storageAccount.ResourceGroupName)/providers/Microsoft.Storage/storageAccounts/$($storageAccount.StorageAccountName)"
$uri = "https://management.azure.com$resourceId/providers/Microsoft.Insights/metrics?api-version=2023-10-01&metricnames=UsedCapacity&aggregation=Average"
try {
$response = Invoke-AzRestMethod -Method Get -Uri $uri
$metrics = $response.Content | ConvertFrom-Json
$usedCapacityMetric = $metrics.value | Where-Object { $_.name.value -eq "UsedCapacity" }
if ($usedCapacityMetric) {
$averageCapacity = $usedCapacityMetric.timeseries.data.average | Measure-Object -Sum | Select-Object -ExpandProperty Sum
} else {
$averageCapacity = 0
}
} catch {
Write-Warning "Failed to retrieve metrics for storage account: $($storageAccount.StorageAccountName)"
$averageCapacity = 0
}
$ctx = $storageAccount.Context
$containers = Get-AzStorageContainer -Context $ctx | Where-Object { $_.Name -eq "test" }
foreach ($container in $containers) {
$blobs = Get-AzStorageBlob -Container $container.Name -Context $ctx
$results += [PSCustomObject]@{
#SubscriptionId = $subscription.Id
SubscriptionName = $subscription.Name
ResourceGroup = $storageAccount.ResourceGroupName
StorageAccount = $storageAccount.StorageAccountName
ContainerName = $container.Name
UsedCapacityInBytes = $averageCapacity
TagName = $tagKey
TagValue = $storageAccount.Tags[$tagKey]
Blobs = $blobs.Name -join ", "
}
}
}
}
# Output the results
$results | Format-Table -AutoSize
Выход:
SubscriptionName ResourceGroup StorageAccount ContainerName UsedCapacityInBytes TagName TagValue Blobs
---------------- ------------- -------------- ------------- ------------------- ------- -------- -----
xxxxx xxxxxx xxxxxxxxxxx Subscription venkatesan-rg venkat891 test 17840077 createdby venkat 22-07-2024.html, 24-07-2024.html, 26-07-2024.html, earth.mp4
xxxxx xxxxxx xxxxxxxxxxx Subscription venkatesan-rg venkat789 test 89083079 createdby venkat test.mp4, research.html, data.html, sun.mp4, 001.csv
Обновлять:
Вы можете использовать приведенный ниже код изменения, чтобы получить виртуальный каталог только из учетной записи хранения.
foreach ($container in $containers) {
$blobs = Get-AzStorageBlob -Container $container.Name -Context $ctx
$directories = $blobs | ForEach-Object {
$parts = $_.Name.Split('/')
for ($i = 0; $i -lt $parts.Length - 1; $i++) {
$parts[0..$i] -join '/'
}
} | Sort-Object -Unique
$results += [PSCustomObject]@{
#SubscriptionId = $subscription.Id
SubscriptionName = $subscription.Name
ResourceGroup = $storageAccount.ResourceGroupName
StorageAccount = $storageAccount.StorageAccountName
ContainerName = $container.Name
UsedCapacityInBytes = $averageCapacity
TagName = $tagKey
TagValue = $storageAccount.Tags[$tagKey]
Directories = $directories -join ", "
}
Спасибо за скрипт, мне потребовалось некоторое время, чтобы его протестировать, так как есть некоторые проблемы с доступом к подпискам. Get-AzStorageBlob перечисляет виртуальные каталоги вместе с файлами внутри них, чего нам хотелось бы избежать. Конечная цель — опубликовать эти сведения в powerBi, и, очевидно, мы не хотим, чтобы в списке отображались файлы, а только виртуальный каталог внутри. контейнер. Это вообще возможно?
@sudhir karamchand Проверьте обновленный ответ.
Большой. Это хорошо работает. Спасибо за код @Venkatesan
Я вижу, что вы скопировали сценарий из одного из ваших предыдущих вопросов (на который ответил Венкатесан). Но я считаю, что вам трудно полностью понять, что он делает. Поэтому вашим первым шагом должно быть понимание того, что он делает.
Я могу попытаться помочь вам в этом, поскольку наибольшую пользу вам принесет, если вы научитесь создавать эти сценарии самостоятельно. Если вы готовы, давайте вместе поработаем над этим ответом, чтобы привести вас к тому, чего вы хотите закончить.
Сначала Вы говорите, что хотите получать объекты хранения только в определенном контейнере. Вам не нужно получать все подписки. Просто используйте Connect-AzAccount (убедитесь, что это версия 3.0.0 или выше, чтобы вы могли сразу выбрать нужную подписку и вам не пришлось самостоятельно задавать контекст).
Второй Вы используете фильтр по тегу. Попробуйте выяснить, что означает пара ключ-значение на любом языке программирования. Вы поймете, почему «любой» вряд ли будет ключом (хотя может быть и значением).
Начать создание сценария
Если вы выполнили первые два замечания, вы заметите, что для начала создания сценария вам нужны только следующие командлеты: Connect-AzAccount
и Get-AzStorageAccount
Теперь пришло время провести небольшое исследование. Посмотрите документацию здесь . Попробуйте получить только ту учетную запись хранения, которая вам нужна (фильтруйте заранее, чтобы вам не приходилось перебирать результаты, если в этом нет необходимости). Когда у вас появятся результаты, отправьте их по ссылке Get-Member
( ) и посмотрите, какие интересующие вас объекты недвижимости могут быть скрыты. Выберите нужные вам свойства, передав результаты по ссылке Select-Object
( ссылка). В случае сомнений я лично использую Select-Object -Property *
при разработке, поскольку получаю четкое представление о том, какие свойства на самом деле содержат данные и что это за данные.
Если вам не хватает свойств, вы можете попробовать объединить данные из разных командлетов. Венкатесан показал вам, как это сделать, в сценарии, который он опубликовал в вашем предыдущем вопросе.
Какой статус вы получаете в ответе? Это 200 ОК или ошибка 400/500? Если вы получаете 200 ОК, то ответ не возвращает никаких данных. Попробуйте удалить ГДЕ и посмотрите, получите ли вы результаты. Возможно, используемые вами фильтры не возвращают никаких данных.