AWS: лямбда — скопируйте теги EC2 на свои EBS, часть 2 — создать функцию лямбда
Давайте продолжим в нашем путешествии функции AWS Lambda, которая скопирует теги AWS EC2 для всех объемов EBS, прилагаемой к нему.
В первой части AWS: лямбда — скопируйте теги EC2 на свои EBS, часть 1 — Python и Boto3 Мы написали сценарий Python, который может получить все экземпляры EC2 в регионе AWS, а затем для каждого EC2 он захватывает свои тома EBS, а затем скопируют все теги AWS из EC2 на все его EBS Plus добавят еще один.
В этой части мы создадим AWS LAMBDA Функция, которая будет запущена с помощью событий CloudWatch AWS.
Содержание
- Создание функции aws lambda
- Добавление Amazon EventBridge (CloudWatch событий) триггер
- AWS LAMBDA: несанкционированность
- Разборка лямбда
Создание функции aws lambda
Перейдите к aws lambda, создайте новую функцию из « автора с нуля », с установленным временем выполнения в виде Python 3.8:
В Роль исполнения Оставьте « Создать новую роль » — позже мы добавим дополнительные разрешения к ней с помощью политики IAM.
Вставьте код сценария на функцию, в конце обновления кода lambda_hanlder ()
Исполнение и в его аргументах вместо « 0, 0» С предыдущего поста установите Событие, контекст
:
Чтобы проверить содержание событие
Объект, который мы будем использовать позже, чтобы получить идентификатор EC2, добавьте свой вывод в журнал функции.
Добавить Импорт JSON
и Печать ("Контекст:" + json.dumps (событие))
:
Кроме того, для EC2.Resource ()
Вызов удалите клавиши AWS и оставьте единственный тип ресурса — « EC2 »:
Не забудьте нажать Развертывание Кнопка, чтобы применить ваши изменения в aws лямбда.
Добавление Amazon EventBridge (CloudWatch событий) триггер
Далее нам необходимо запускать эту функцию каждый раз, когда в регионе запущен новый EC2.
Здесь мы можем использовать Amazon EventBridge (бывшие события CloudWatch). Перейти к CloudWatch события> Правила нажмите на Создать правило :
В Шаблон событий Выберите Имя службы, в Тип события Выберите « » EC2 экземпляра Уведомление о состоянии изменения состояния », а в Специфические государства (ы) Выберите Бег :
С правой стороны в Добавить цель Выберите функцию AWS Lambda, которые мы создали выше:
В конце страницы в Показать образец события (ы), Мы можем увидеть пример событие
Объект, который будет передан функции, чтобы получить ID EC2:
Сохраните новое правило:
Проверьте, добавлялось ли он в функцию лямбда в качестве триггера:
И давайте проверим, как это будет работать.
В правилах облака открывают мониторинг правила:
Сверните новый EC2, например, запуская автосовую группу:
На графике CloudWatch мы можем видеть, что правило сработало:
Проверьте журналы функции лямбда:
AWS LAMBDA: несанкционированность
В журналах мы заинтересованы в двух записях.
Первый — это событие
Содержание, которое было сохранено в журнал из Печать ("Контекст:" + json.dumps (событие))
:
А второй — это «Clienterror: Произошла ошибка (несанкционированность) при вызове операции описания: Вы не авторизованы выполнять эту операцию « Ошибка:
Вопрос здесь очевиден достаточно: наша функция лямбда теперь использует роль IAM, которая была создана во время создания функции, и она не имеет разрешений для вызовов API для действий EC2:
Перейдите к AWS IAM, найдите роль, нажмите на Приложить политики :
Создать новую политику:
Опишите разрешения EC2 здесь:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DeleteTags", "ec2:CreateTags", "ec2:DescribeVolumes" ], "Resource": "*" } ] }
Сохрани это:
Вернитесь к роли IAM функции лямбда и добавьте новую политику:
Повторите новый запуск EC2 и проверьте журналы функции снова:
Ура! » Оно работает! » ©
Далее необходимо обновить код, чтобы получить Идентификатор экземпляра
от событие
объект.
Разборка лямбда
Мы уже видели пример события, когда мы создали правило CloudWatch, и мы знаем, что он будет передан на lambda_handler ()
Функция как Python-словарь с набором клавиш:
{ "version": "0", "id": "a99597e5-90a5-5ac3-3aba-da3ecd51452a", "detail-type": "EC2 Instance State-change Notification", "source": "aws.ec2", "account": "534***385", "time": "2021-10-11T09:02:09Z", "region": "eu-west-3", "resources": [ "arn:aws:ec2:eu-west-3:534***385:instance/i-0cc24729109ba61e5" ], "detail": { "instance-id": "i-0cc24729109ba61e5", "state": "running" } }
И отсюда нам нужно получить значение деталей. Enstance-ID-элемент.
Добавьте новую переменную в скрипт, давайте назовем это induction_id
И это будет сохранять ценность от событие [«Деталь»] [«Экземпляр-идентификатор»]
, а затем, используя этот идентификатор, мы создаем новый объект EC2.Instance
класс, EC2.Instance (экземпляр_id)
:
Вместо того, чтобы запустить новый EC2 вручную, мы можем использовать Тест Для нашей лямбда, проходя событие
объект к нему.
Создайте новое тестовое событие:
Добавьте данные, похожие на то, что мы получим от CloudWatch:
{ "version": "0", "id": "a99597e5-90a5-5ac3-3aba-da3ecd51452a", "detail-type": "EC2 Instance State-change Notification", "source": "aws.ec2", "account": "534***385", "time": "2021-10-11T09:02:09Z", "region": "eu-west-3", "resources": [ "arn:aws:ec2:eu-west-3:534***385:instance/i-0cc24729109ba61e5" ], "detail": { "instance-id": "i-0cc24729109ba61e5", "state": "running" } }
Запустите тест:
«Оно работает!» _ ©_
И теперь давайте раскрутим общий EC2, чтобы проверить всю схему, включая событие CloudWatch, триггер лямбда и результаты его выполнения.
Trigger AutoScaling Group:
Новый EC2 I-051F2E1F1BC8D332B Был создан, проверьте журналы лямбда:
Найти EBS этого EC2:
И проверьте свои теги:
И код функции теперь следующий:
#!/usr/bin/env python import os import json import boto3 def lambda_handler(event, context): ec2 = boto3.resource('ec2') instance_id = event["detail"]["instance-id"] instance = ec2.Instance(instance_id) print("[DEBUG] EC2\n\t\tID: " + str(instance)) print("\tEBS") for vol in instance.volumes.all(): vol_id = str(vol) print("VOLUME: " + str(vol)) device_id = "ec2.vol.Device('" + str(vol.attachments[0]['Device']) + "')" print("\t\tID: " + vol_id + "\n\t\tDev: " + device_id) role_tag = vol.create_tags(Tags=set_role_tag(vol)) ec2_tags = vol.create_tags(Tags=copy_ec2_tags(instance)) print("\t\tTags set:\n\t\t\t" + str(role_tag) + "\n\t\t\t" + str(ec2_tags) + "\n") def is_pvc(vol): try: for tag in vol.tags: if tag['Key'] == 'kubernetes.io/created-for/pvc/name': return True break except TypeError: return False def set_role_tag(vol): device = vol.attachments[0]['Device'] tags_list = [] values = {} if is_pvc(vol): values['Key'] = "Role" values['Value'] = "PvcDisk" tags_list.append(values) elif device == "/dev/xvda": values['Key'] = "Role" values['Value'] = "RootDisk" tags_list.append(values) else: values['Key'] = "Role" values['Value'] = "DataDisk" tags_list.append(values) return tags_list def copy_ec2_tags(instance): tags_list = [] values = {} for instance_tag in instance.tags: if instance_tag['Key'] == 'Env': tags_list.append(instance_tag) elif instance_tag['Key'] == 'Tier': tags_list.append(instance_tag) elif instance_tag['Key'] == 'DataClass': tags_list.append(instance_tag) elif instance_tag['Key'] == 'JiraTicket': tags_list.append(instance_tag) return tags_list if __name__ == " __main__": lambda_handler(event, context)
Сделанный.
Первоначально опубликовано в RTFM: Linux, DevOps и системное управление Отказ
Оригинал: «https://dev.to/setevoy/aws-lambda-copy-ec2-tags-to-its-ebs-part-2-create-a-lambda-function-o4l»