Зачем использовать лямбда-функцию AWS?
Создание планировщика AWS для управления временем запуска и остановки вашей базы данных позволяет снизить затраты, связанные с задержкой активных ресурсов. Вам не нужны все ваши базы данных, работающие 24/7, и вы сами выбираете, когда останавливать БД, не является идеальным долгосрочным решением. К счастью, вы можете планировать деятельность вашей базы данных без ручного вмешательства.
В отличие от очень простой опции остановки вашей БД через консоль AWS, этот процесс будет немного более детальным. Дополнительное преимущество гибкого планировщика AWS и отсутствие необходимости беспокоиться о автоматическом запуске БД через неделю делает небольшой процесс более стоящим.
Как написать функцию инстанса остановки AWS RDS на Lambda?
Создать политику
Во-первых, мы должны создать политику для присоединения роли IAM.
- Перейти к консоли AWS
- Выберите услугу IAM
- Нажмите на Политики
- Нажмите на кнопку Создать политику
- Нажмите на вкладку JSON и вставьте JSON, показанный ниже, чтобы получить доступ к определенным действиям RDS и событиям Cloud Watch Log.
В AWS есть визуальный редактор для создания политики, но вы можете просто скопировать и вставить приведенный ниже код JSON для вашего удобства.
питон
1
{
2
"Version": "2012-10-17",
3
"Statement": [
4
{
5
"Effect": "Allow",
6
"Action": [
7
"rds:DescribeDBInstances",
8
"rds:StopDBInstance",
9
"rds:StartDBInstance"
10
],
11
"Resource": "*"
12
},
13
{
14
"Effect": "Allow",
15
"Action": [
16
"logs:CreateLogGroup",
17
"logs:CreateLogStream",
18
"logs:PutLogEvents"
19
],
20
"Resource": "*"
21
}
22
]
23
}
24
- Дайте политике имя, manual_RDS_Schedule и добавьте описание. Нажмите «Создать политику».
Создать роль
Роль IAM позволяет делать запросы на обслуживание, необходимые для планирования экземпляра остановки AWS RDS , а также предоставляет доступ к журналам CloudWatch.
- Перейти к консоли IAM
- Перейти к ролям
- Нажмите на создание ролей
- Выберите «Лямбда» в разделе «Сервис AWS».
- Выполните поиск Policy_ в строке поиска, и политика, которую вы создали ранее, появится.
- Дайте роли имя ManualScheduleRDS и нажмите «Создать роль».
- Прикрепите политику manual_RDS_Schedule к роли
Создайте лямбда-функцию AWS
Перед созданием лямбда-функции убедитесь, что ваш регион совпадает с регионом, в котором вы создали экземпляр БД.
Поскольку вы можете управлять экземплярами в нескольких регионах, для правильной работы функции необходимо выбрать правильный регион. Позже вы можете использовать ту же функцию для ваших экземпляров, размещенных в нескольких регионах.
Вы сможете получить имя экземпляра остановки AWS RDS и зону доступности от администратора.
- Перейти к услугам
- Нажмите на лямбду
- Нажмите на Создать функцию
- Выберите автора с нуля
Введите следующую информацию в окне:
- Имя: StopRDSInstances
- Время выполнения: Python 3.8
- Роль: выберите существующую роль
- Имя роли: ManualScheduleRDS
- Нажмите на Создать функцию
Вы найдете ресурс ARN, созданный для функции Lambda, в правом верхнем углу. Ресурс позволяет функции обращаться к лямбда-API GetFunctionConfiguration и к лямбда-переменной среды AWS.
Теперь вернитесь к роли ManualScheduleRDS и нажмите «Добавить встроенную политику».
Теперь вставьте следующий JSON в редактор.xxxxxxxxxx
1
{
2
"Version": "2012-10-17",
3
"Statement": [
4
{
5
"Effect": "Allow",
6
"Action": "lambda:GetFunctionConfiguration",
7
"Resource": "arn:aws:lambda:<region>:<Account_id>:function:StopRDSInstances"
8
}
9
]
10
}
Назначьте ARN для кода JSON и затем нажмите «Сохранить».
AWS Lambda теперь будет отображаться в качестве ресурса в функции.
Обновить код
Добавьте следующий код Python в функцию.
питон
xxxxxxxxxx
1
import sys
2
import botocore
3
import boto3
4
from botocore.exceptions import ClientError
5
def lambda_handler(event, context):
6
rds = boto3.client('rds')
7
lambdaFunc = boto3.client('lambda')
8
print('Trying to get Environment variable')
9
try:
10
funcResponse = lambdaFunc.get_function_configuration(
11
FunctionName='StopRDSInstances'
12
)
13
DBinstance = funcResponse['Environment']['Variables']['DBInstanceName']
14
print('Stopping RDS service for DBInstance : ' + DBinstance)
15
except ClientError as e:
16
print(e)
17
try:
18
response = rds.stop_db_instance(
19
DBInstanceIdentifier=DBinstance
20
)
21
print('Success :: ')
22
return response
23
except ClientError as e:
24
print(e)
25
return
26
{
27
'message' : "Script execution completed. See Cloudwatch logs for complete output"
28
}
Строка кода, отвечающая за остановку RDS, - это rds.stop_db_instance.
Переменная среды AWS Lambda , DBInstanceName проводится по переменной DBInstance. Эта переменная среды является парой ключ-значение, которая позволит вам использовать эту лямбда-функцию в других средах, таких как Dev, QA или Prod.
Настройте функцию
- Введите пару ключ-значение, DBInstanceName и <имя экземпляра userDB>.
- Установите роль выполнения в ManualScheduleRDS
- Сохранить функцию
Проверьте функцию
- Выберите Test, а затем настройте Test сверху
- Выберите Создать новые тестовые события.
- Выберите шаблон события Hello World
Сохранить и все готово! Теперь у вас есть лямбда-функция для остановки вашего экземпляра RDS. Если вы получите сообщение «Экземпляр <> не доступен», значит, ваша БД не запущена.
Переход к функциям запуска
Процесс настройки функции Start идентичен функции Stop, при этом большинство изменений относятся к именам и некоторым строкам кода.
- Назовите вашу функцию StartRDSInstances
- Обновите встроенную политику следующим JSON
питон
xxxxxxxxxx
1
{
2
"Version": "2012-10-17",
3
"Statement": [
4
{
5
"Effect": "Allow",
6
"Action": "lambda:GetFunctionConfiguration",
7
"Resource": "arn:aws:lambda:<region>:<Account_id>:function:StartRDSInstancest"
8
}
9
]
10
}
- Сохраните политику как policy_rds_start
- Обновить код функции
питон
xxxxxxxxxx
1
import sys
2
import botocore
3
import boto3
4
from botocore.exceptions import ClientError
5
def lambda_handler(event, context):
6
# TODO implement
7
rds = boto3.client('rds')
8
lambdaFunc = boto3.client('lambda')
9
print('Trying to get Environment variable')
10
try:
11
funcResponse = lambdaFunc.get_function_configuration(
12
FunctionName='StartRDSInstances'
13
)
14
#print (funcResponse)
15
DBinstance = funcResponse['Environment']['Variables']['DBInstanceName']
16
print('Starting RDS service for DBInstance : ' + DBinstance)
17
except ClientError as e:
18
print(e)
19
try:
20
response = rds.start_db_instance(
21
DBInstanceIdentifier=DBinstance
22
)
23
print('Success :: ')
24
return response
25
except ClientError as e:
26
print(e)
27
return
28
{
29
'message' : "Script execution completed. See Cloudwatch logs for complete output"
30
}
- Выполните остальные шаги, как указано ранее.
Как установить расписание?
Теперь, когда у вас есть две лямбда-функции в вашем распоряжении, вам просто нужно определить, когда их вызывать. Для этого вам нужно будет установить правило для AWS CloudWatch.
- Перейти к CloudWatch
- Нажмите на правила
- Выберите «Расписание», а затем добавьте выражение Cron, чтобы выбрать время суток.
- Добавьте для запуска или остановки лямбда-функции, созданные ранее, как «Target» для вызова
Запланированный экземпляр RDS теперь готов к работе, вам не нужно больше останавливаться и перезапускать ваши экземпляры. Для более простой альтернативы вы можете автоматизировать весь этот процесс с помощью простых рабочих процессов .