Поиск неиспользуемой учетной записи хранилища azure ARM

#azure #powershell #azure-cli #azure-storage-account

#azure #powershell #azure-cli #azure-storage-account

Вопрос:

Я достиг жесткого предела в 250 учетных записей хранилища для своей подписки. Учетные записи хранилища были созданы с помощью ARM

Мне нужен способ найти неиспользуемые учетные записи хранилища и удалить их. По сути, я хочу найти учетные записи хранилища с контейнерами, к которым не обращались в течение 90 дней, и выполнить очистку.

Есть ли способ проверить время последнего обращения или лучший способ очистки с помощью PowerShell или, предпочтительно, azure cli

Спасибо

Ответ №1:

Что вы могли бы сделать, это получить самый последний измененный контейнер из LastModified свойства, а затем проверить, является ли эта временная метка меньше текущей даты минус 90 дней. Нам нужно было бы проверить как на уровне контейнера, так и на уровне больших двоичных объектов с последними изменениями свойств.

 # Set current context to subscription
Set-AzContext -SubscriptionId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

# Go through every storage account in your subscription
foreach ($storageAccount in Get-AzStorageAccount) {
    $storageAccountName = $storageAccount.StorageAccountName
    $resourceGroupName = $storageAccount.ResourceGroupName

    # Get key1 storage account key
    $storageAccountKey = (Get-AzStorageAccountKey -Name $storageAccountName -ResourceGroupName $resourceGroupName).Value[0]

    # Create storage account context using above key
    $context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey

    # fetch all containers
    $containers = Get-AzStorageContainer -Context $context

    $deleteStorageAccount = $false
    foreach ($container in $containers) {

        # First check if container has been modified
        if ($container.LastModified.DateTime -lt (Get-Date).AddDays(-90)) {
            $deleteStorageAccount = $true
            break
        }

        # Get all blobs from container, including deleted blobs
        $blobs = Get-AzStorageBlob -Container $container.Name -Context $context -IncludeDeleted

        # Then check each blob in container
        foreach ($blob in $blobs) {
            if ($blob.LastModified.DateTime -lt (Get-Date).AddDays(-90)) {
                $deleteStorageAccount = $true
                break
            }
        }
    }

    # If this flag is set, storage account has been acccessed in last 90 days
    if ($deleteStorageAccount) {
        Remove-AzStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName -Force -WhatIf
    }
}
  

Поскольку это действие может быть чрезвычайно вредным, вы можете запустить Remove-AzStorageAccount с -WhatIf , чтобы увидеть, какие учетные записи хранилища будут удалены, прежде чем удалять их по-настоящему.

Комментарии:

1. Это не очень хорошее решение, поскольку LastModified свойство контейнера указывает только на модификацию контейнера, но не на большие двоичные объекты внутри контейнера. Для этого вам нужно просмотреть каждое свойство blob LastModified -объекта в каждом контейнере.

2. @OlehTarasenko Очень хороший момент, я обновил свой ответ, включив проверку каждого большого двоичного объекта. Проверка уровня контейнера и большого двоичного LastModified объекта, вероятно, лучше всего здесь.

3. Кроме того, поскольку поиск каждого большого двоичного объекта может занять много времени, здесь, вероятно, также потребуется некоторая параллельная обработка.

Ответ №2:

Это все еще не очень хорошо, потому что для удаления всей учетной записи хранилища требуется всего 1 контейнер или большой двоичный объект за пределами 90 дней. Если вы хотите пойти другим путем, предположим, что вы собираетесь удалить, если не найдете его в течение 90 дней:

 # Set current context to subscription
Set-AzContext -SubscriptionId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

# Go through every storage account in your subscription
foreach ($storageAccount in Get-AzStorageAccount) {
$storageAccountName = $storageAccount.StorageAccountName
$resourceGroupName = $storageAccount.ResourceGroupName

# Get key1 storage account key
$storageAccountKey = (Get-AzStorageAccountKey -Name $storageAccountName -ResourceGroupName $resourceGroupName).Value[0]

# Create storage account context using above key
$context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey

# fetch all containers
$containers = Get-AzStorageContainer -Context $context

$deleteStorageAccount = $true
foreach ($container in $containers) {

    # First check if container has been modified
    if ($container.LastModified.DateTime -ge (Get-Date).AddDays(-90)) {
        $deleteStorageAccount = $false
        break
    }

    # Get all blobs from container, including deleted blobs
    $blobs = Get-AzStorageBlob -Container $container.Name -Context $context -IncludeDeleted

    # Then check each blob in container
    foreach ($blob in $blobs) {
        if ($blob.LastModified.DateTime -ge (Get-Date).AddDays(-90)) {
            $deleteStorageAccount = $false
            break
        }
    }
}

# If this flag is set, storage account has been acccessed in last 90 days
if ($deleteStorageAccount) {
    Remove-AzStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName -Force -WhatIf
}
  

}

Комментарии:

1. При этом также будут обнаружены пустые контейнеры, созданные в течение последних 90 дней. Которую может быть полезно удалить, но также может вызвать проблемы.