Установка лимита трат на Azure
- Алик Ким
- 15 окт. 2023 г.
- 3 мин. чтения
Решил разместить хобби-проектик на Azure. хочется этот хостинг иметь бесплатным , ну или почти бесплатным. как я понял, Azure берет деньги за пользование мощностями. так что, по идее, если проект не станет супер-популярным - хостинг должен стоить копейки.
одно меня беспокоило: а вдруг какая-нибудь дос-атака вознесет нагрузку до небес и сломает мой кошелек полностью?
мне бы хотелось, чтоб после достижения месячными расходами какого-то порога все просто отключалось.
из коробки там в этом плане есть только оповещение по имейлу по достижении порога.
пришлось немного попотеть. вот, на днях заработало!
сейчас изложу здесь, что помню, пока воспоминания свежи.
аккаунт я завел себе бесплатный, который они там предлагают. потом прошли все бесплатные и демонстрационные периоды, меня попросили куда-то там в другой режим перейти. в общем, сейчас, вроде, мой аккаунт/тариф называется "Pay-as-you-go".
основывался на этих статьях (хотя, у меня получилось в итоге достаточно сильно по-другому, вроде):
Service Principal
для начала нам нужен Service Principal. Это - учетка, из-под которой будет запускаться наш скрипт выключения. Вроде как, специальный тип учетки для запуска скриптов , или как то так.
Ей нужно задать роль Contributor. Этой роли разрешается управлять ресурсами Azure (в частности, включать/выключать вэб-приложения, что нам и нужно)
Ее Сикрет будет отображен один раз при создании, нужно его сохранить. Хотя, если что – можно сгенерить еще сикрет, если этот потеряется, не обязательно для этого создавать новый Service Principal.
Список сервис-принципалов можно посмотреть (и создать новый) в Entra ID (это теперь так Active Directory называется) – App Registrations
жмем Add – App Registration.
Там предлагают выбрать тип, и там фигурирует «multitenant». Multitenant – тут речь идет о том, что под одним аккаунтом Azure может быть несколько организаций. Мы выбираем , мол, одна организация (пофиг на самом деле)
все, создали, сохранили сикрет.
За одно можно сохранить Application ID, он тоже понадобится.
Automation Account
это — чтото типа группы скриптов.
Идем в Automation Accounts, создаем.
Кажется, все настройки я принял по дефолту.
А теперь нам пригодится сикрет нашего ServicePrincipal.
Заходим в Credentials, добавляем. В качестве UserId – Application ID сервис-принципала. А в качестве пароля — его сикрет.
TenantId
насчет того, что такое тенант — написал выше.
тоже нам понадобится. Как получить: в поиске пишем Tenant Properties – там копируем значение
Runbook
это — собственно, скрипт.
В нашем Automation Account заходим в Runbooks, создаем. Выбираем тип Powershell, спросит про версию — я выбрал ту, что постарше (5-ю, кажется)
тээк, теперь Edit – Edit on Portal.
Скрипт выключения всех вэб-приложений выглядит так:
$ServicePrincipalCred = Get-AutomationPSCredential -Name 'BudgetTrasholdServicePrincipalCreds'
Connect-AzAccount -Credential $ServicePrincipalCred -ServicePrincipal -Tenant 'XXXX-XXXX-XXXX-XXXX-XXXXXX'
# Получаем список всех ресурсных групп
$resourceGroups = Get-AzResourceGroup
# Останавливаем все веб-приложения в каждой ресурсной группе
foreach ($resourceGroup in $resourceGroups) {
$webApps = Get-AzWebApp -ResourceGroupName $resourceGroup.ResourceGroupName
foreach ($webApp in $webApps) {
Stop-AzWebApp -Name $webApp.Name -ResourceGroupName $resourceGroup.ResourceGroupName
}
}
в первой строчке считываются креденшалы. «BudgetTrasholdServicePrincipalCreds» - это имя , которое я задал при создании Credential для Automation Account
вторая строчка — Tenant-ID
жмем Publish, чтоб сохранился.
проверка скрипта
для проверки надо бы создать вэб-прилжение (Web App) и захостить туда что-нибудь, убедиться, что приложение работает.
(сами разберетесь)
Теперь заходим в наш RunBook , жмем Start, на появившемся экране жмем таб «All Logs»
если будут ошибки — там отобразятся. Ну и проверяйте свое приложение, оно в течение нескольких минут должно погаснуть. Погасло — значит, все работает.
Бюджет
теперь нужно , чтоб этот скрипт запускался по достижении порога трат.
Для этого переходим в Cost Management – Budgets.
Теперь важный нюанс, ради которого я с поддержкой созванивался:
в качестве Scope стоит ваш пользователь. Нужно там выбрать подписку (subscription)
ок, создаем бюджет,
в поле Amount – наш порог.
Next -
тут под блоком Alert Conditions должна быть ссылочка «Manage acrion group» - вот ее не было , пока манипуляцию со скоупом не сделал.
Идея такая: создаем в action-группе действие при достижении 100% порога — вызов нашего runbook (еще можно добавить уведомление по имейлу при, скажем, 75%)
потом выбираем эту акшен-группу в бюджете.
Итак, создаем Action Group. В табе Notifications можно настроить уведомление по имейлу. А в табе Actions – добавляем вызов нашего Automation Runbook.
Закончили — жмем крестик, типа, закрываем диалог Action Groups. Видим опять экран создания бюджета
и там в блоке Alert Conditions выбираем нашу Action Group
уфффф! Это было сложно, блин!
Кстати, в процессе разбирательств неоценимую помощь мне оказали ChatGPT и его друг-конкурент от Google – Bard. Всем рекомендую!
Ну и поддержке Microsoft Azure спасибо — разбирались-разбирались, в итоге она предложила созвониться, назначила время, пообщались, она там пошла с коллегами советоваться… в общем, занимались моей проблемой.
И это при том, что на данный момент я плачу им 89 центов в месяц :) (пока что ничего не запущено)
Comments