#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
свойство контейнера указывает только на модификацию контейнера, но не на большие двоичные объекты внутри контейнера. Для этого вам нужно просмотреть каждое свойство blobLastModified
-объекта в каждом контейнере.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 дней. Которую может быть полезно удалить, но также может вызвать проблемы.