Рубрики
Uncategorized

AWS: лямбда — скопируйте теги EC2 на свои EBS, часть 2 — создать функцию лямбда

AWS: Lambda — Скопируйте теги EC2 на свои EBS, часть 2 — Создать функцию лямбда Давайте продолжим … Помечено с AWS, Serverless, DevOps, Tutorial.

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

Перейдите к 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»