Скрипт PowerShell для вывода списка больших двоичных объектов хранилища Azure

У меня есть это требование, чтобы получить сведения об учетной записи хранения и получить список больших двоичных объектов хранилища, отфильтрованных с помощью определенного «теста» контейнера. Я получил этот справочный код из 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

Какой статус вы получаете в ответе? Это 200 ОК или ошибка 400/500? Если вы получаете 200 ОК, то ответ не возвращает никаких данных. Попробуйте удалить ГДЕ и посмотрите, получите ли вы результаты. Возможно, используемые вами фильтры не возвращают никаких данных.

jdweng 30.07.2024 14:16
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
1
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я ожидаю, что сценарий выведет сведения об учетной записи хранения (отфильтрованные по тегам), размер учетной записи хранения, контейнер (отфильтрованный по конкретному контейнеру) и список больших двоичных объектов из отфильтрованных контейнеров.

Вы можете использовать приведенный ниже скрипт, чтобы получить 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 01.08.2024 10:36

@sudhir karamchand Проверьте обновленный ответ.

Venkatesan 01.08.2024 11:27

Большой. Это хорошо работает. Спасибо за код @Venkatesan

sudhir karamchand 02.08.2024 10:55

Я вижу, что вы скопировали сценарий из одного из ваших предыдущих вопросов (на который ответил Венкатесан). Но я считаю, что вам трудно полностью понять, что он делает. Поэтому вашим первым шагом должно быть понимание того, что он делает.

Я могу попытаться помочь вам в этом, поскольку наибольшую пользу вам принесет, если вы научитесь создавать эти сценарии самостоятельно. Если вы готовы, давайте вместе поработаем над этим ответом, чтобы привести вас к тому, чего вы хотите закончить.

Сначала Вы говорите, что хотите получать объекты хранения только в определенном контейнере. Вам не нужно получать все подписки. Просто используйте Connect-AzAccount (убедитесь, что это версия 3.0.0 или выше, чтобы вы могли сразу выбрать нужную подписку и вам не пришлось самостоятельно задавать контекст).

Второй Вы используете фильтр по тегу. Попробуйте выяснить, что означает пара ключ-значение на любом языке программирования. Вы поймете, почему «любой» вряд ли будет ключом (хотя может быть и значением).

Начать создание сценария Если вы выполнили первые два замечания, вы заметите, что для начала создания сценария вам нужны только следующие командлеты: Connect-AzAccount и Get-AzStorageAccount

Теперь пришло время провести небольшое исследование. Посмотрите документацию здесь . Попробуйте получить только ту учетную запись хранения, которая вам нужна (фильтруйте заранее, чтобы вам не приходилось перебирать результаты, если в этом нет необходимости). Когда у вас появятся результаты, отправьте их по ссылке Get-Member ( ) и посмотрите, какие интересующие вас объекты недвижимости могут быть скрыты. Выберите нужные вам свойства, передав результаты по ссылке Select-Object ( ссылка). В случае сомнений я лично использую Select-Object -Property * при разработке, поскольку получаю четкое представление о том, какие свойства на самом деле содержат данные и что это за данные.

Если вам не хватает свойств, вы можете попробовать объединить данные из разных командлетов. Венкатесан показал вам, как это сделать, в сценарии, который он опубликовал в вашем предыдущем вопросе.

Другие вопросы по теме

Похожие вопросы

Устойчивые функции Azure не вызываются при использовании с триггером Q с использованием управляемого удостоверения
Проблема развертывания Blazor WASM Core в Azure
Проблема с портом 8080 веб-приложения автоматического развертывания Azure
Azure Pipeline AzureContainerApps@1 не развертывает новый образ
Подключитесь к Azure AD с помощью субъекта-службы, чтобы получить список пользователей и информацию
Зависимость между элементами в цикле foreach в terraform
Конвейер Azure Synapse CI/CD: переопределить имя пула Apache Spark в ноутбуках
Сервер Azure ответил статусом 429. Сообщение об ошибке: {'ошибка': {'код': '429', 'сообщение': 'Превышен предел скорости. Повторите попытку через 57 секунд.'}}
Укажите срок действия при запросе токена доступа при входе в Microsoft oauth2 v2.0
Как использовать управляемое удостоверение или другую постоянную аутентификацию для виртуальной машины, не находящейся в Azure?