Представьте, что у вас в облаке маленький проектик. Уже полгода вы платите за него по 20 центов в месяц. В принципе, ничего особенного. Но однажды утром вдруг приходит крупный счёт на 2700 долларов.
В облаке мы платим за хранение, вычисления и другие услуги по мере их использования. Не нужно поднимать собственный сервер. Однако недостаток в том, что можно случайно потратить больше денег, чем есть в кошельке. Это особенно сложно с бессерверными решениями, которые автоматически масштабируются вместе с поступающим трафиком.
Случайно оставите без присмотра дорогую VM или ваши лямбда-функции выйдут из-под контроля — и это может привести к неожиданному счёту.
В этой статье рассмотрим, как работает биллинг и как предотвратить появление неожиданных счетов.
Малый бизнес, маленькие счета
Эта статья о персональным проектах и маленьких компаниях с относительно небольшими счетами. Какая-нибудь крупная корпорация может и не заметить разницу в 3000 долларов.
Идеального решения не существует
К сожалению, тут нет идеального решения. Как рассказывает в своём подкасте Кори Куинн, биллинговая система AWS отстаёт на несколько часов, а в некоторых случаях до 24 или 48 часов. В результате оповещения о превышении квоты могут сработать через несколько часов или дней после того, как произошёл значительный перерасход. Оповещения по-прежнему отличный инструмент для защиты от лишних расходов, но только в тех случаях, когда вы что-то забыли на несколько дней, например, не остановили дорогой инстанс EC2 после семинара по машинному обучению.
Вы сами выбираете, сколько времени потратить на защиту от непредвиденных расходов, но настоятельно рекомендую потратить две минуты на настройку бюджетных оповещений!
Защитные механизмы
Есть множество механизмов для защиты от неожиданных счетов. Рассмотрим безопасность, оповещения, действия по исправлению ситуации и улучшение видимости.
1. Защитите аккаунт с помощью многофакторной аутентификации
Это первое, что вы должны настроить при создании новой учетной записи AWS.
Вот официальное руководство от AWS по настройке многофакторной аутентификации (MFA), которая представляет дополнительный барьер против злоумышленников.
2. Бюджетные оповещения
Это второе, что нужно настроить при создании нового аккаунта AWS.
Бюджетные оповещения — самый популярный способ следить за своими расходами. Например, по электронной почте приходит уведомление о превышении лимита. Можно дополнительно настроить уведомления с помощью Amazon SNS или AWS Chatbot.
Вот короткое видео (52 секунды) по созданию первого бюджетного оповещения. Райан Льюис сделал более длинное видео с более подробным описанием, деталями бюджетных оповещений и множеством способов их настройки.
Если вы уже используете CDK, то лучше всего использовать пакет aws-budget-notifier.
С какой суммы начинать?
Начните с суммы, которая немного превышает ваши текущие расходы и которая вас устраивает. Например, 10 долларов. Если у вас уже есть рабочие нагрузки, которые работают несколько месяцев, то возьмите среднюю цифру и добавьте 50%.
Также рекомендую настроить несколько оповещений о выставлении счетов с различными пороговыми значениями:
- Комфортное предупреждение: сумма, с которой вы готовы смириться, но потом изучите счёт.
- Опасное предупреждение: вы уже не чувствуете себя комфортно и хотите закрыть сервис как можно скорее. Если комфортная сумма составляет $10, то эта может быть $100.
- Критическое предупреждение: при такой сумме уже возникает желание сбросить ядерную бомбу на свой аккаунт. Если комфортная сумма составляет $10, то эта может быть $500. Вы можете прикрепить к этому оповещению специальные бюджетные действия или оповещения на пейджер, чтобы автоматически остановить инстансы EC2 или разбудить вас.
В дополнение к заранее установленным пороговым значениям, вы также можете попробовать сервис обнаружения аномалий в стоимости услуг AWS.
Ядерная бомба на крайний случай
Поскольку вы можете отправлять уведомления в SNS, то можно запустить лямбда-функцию, которая запускает aws-nuke с разрушением всей инфраструктуры в вашем аккаунте. Никогда не используйте это на аккаунте в продакшне. Для дополнительной информации загляните в репозиторий GitHub.
3. Бюджетные действия
Недавно AWS представила бюджетные действия (Budget Actions). Это расширение для бюджетных оповещений (Budget Alerts), где при превышении бюджетного лимита запускаются определённые действия. В дополнение к отправке уведомлений по электронной почте теперь вы можете применять пользовательские политики IAM, такие как «Запретить запуск инстансов EC2» или позволить AWS закрыть инстансы EC2 и RDS, как показано ниже.
4. Мобильное приложение
Консоль AWS для мобильных приложений даёт возможность проверить все расходы в 3-5 нажатий.
Вот два экрана из мобильного приложения:
Чтобы использовать приложение, следует настроить выделенного пользователя, который получает только те разрешения, что необходимы приложению для отображения ваших расходов.
Вот политика IAM, которая даёт приложению доступ на чтение, а также к оповещениям cloudwatch.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ce:DescribeCostCategoryDefinition",
"ce:GetRightsizingRecommendation",
"ce:GetCostAndUsage",
"ce:GetSavingsPlansUtilization",
"ce:GetReservationPurchaseRecommendation",
"ce:ListCostCategoryDefinitions",
"ce:GetCostForecast",
"ce:GetReservationUtilization",
"ce:GetSavingsPlansPurchaseRecommendation",
"ce:GetDimensionValues",
"ce:GetSavingsPlansUtilizationDetails",
"ce:GetCostAndUsageWithResources",
"ce:GetReservationCoverage",
"ce:GetSavingsPlansCoverage",
"ce:GetTags",
"ce:GetUsageForecast",
"health:DescribeEventAggregates",
"cloudwatch:DescribeAlarms",
"aws-portal:ViewAccount",
"aws-portal:ViewUsage",
"aws-portal:ViewBilling"
],
"Resource": "*"
}
]
}
Разрешения разбиваются на три группы:
- CloudWatch Cost Explorer (всё, что начинается с
ce:
). Подробная информация о текущих и прогнозируемых расходах. - Предупреждения чтения CloudWatch (
cloudwatch:DescribeAlarms
). Показывает предупреждения, но не позволяет ничего сделать. - Общий доступ (разрешения, начинающиеся с
aws-portal:
иhealth:
). Позволяют отобразить мобильную панель мониторинга.
5. Менеджер секретов
Если случайно выложить ключи доступа в публичный репозиторий, злоумышленники могут запустить в вашем аккаунте дорогие инстансы EC2 и использовать их, например, для майнинга биткоинов. Были сообщения о случаях, когда маленькие инстансы прячутся в малоиспользуемых регионах, так что владелец не замечает их в детализации биллинга.
Чтобы очистить код от ключей доступа или других секретов, можно использовать менеджер секретов AWS Secrets Manager.
При создании первого секрета следуйте этому руководству AWS. После этого замените секрет из кодовой базы, запрашивая его с помощью одного из официальных клиентов AWS (boto3 для Python).
import boto3
client = boto3.client('secretsmanager')
response = client.get_secret_value(SecretId='replace-me')
secret = response['SecretString']
Обратите внимание, что каждый секрет стоит $0,40 в месяц, плюс $0,05 за 10000 вызовов API.
Служба поддержки
Если вам пришёл неожиданный счёт, остановите все приложения, из-за которых возникла ситуация, при необходимости поменяйте ключи доступа и обратитесь в службу поддержки AWS. Вот 20-секундное видео, куда нажимать.
Пошаговая инструкция по подаче заявки в службу поддержки:
- В правом верхнем углу нажмите кнопку Support и выберите Support Center
- Нажмите оранжевую кнопку Create case
- Выберите аккаунт и биллинг
- В качестве типа выберите «Биллинг», а в качестве категории — «Проблема с платежами»
- Заполните все детали и отправляйте
Хотя некоторым возместили их неожиданный счёт, слишком не рассчитывайте на это.
Вывод
Первое, что нужно сделать, это настроить MFA и бюджетные оповещения. После этого можете изучить более сложные операции, такие как бюджетные действия, чтобы заблокировать аккаунт, если расходы резко возрастут.
Чтобы секреты и ключи доступа не попали в публичные репозитории, сохраняйте их в AWS Secrets Manager.
Автор: m1rko