Как избежать устаревания результатов при вызове API AWS Cloud Trail

Мы используем AWS Cloud Trail для извлечения данных (события облачного следа). Мы использовали гем aws-sdk-cloudtrail (версия 1.0). Согласно Cloud Trail мы можем получить максимум 50 результатов (последний раз). Чтобы получить предыдущие (более старые) результаты, мы используем «следующий токен», полученный в предыдущем ответе. Мы выполняем это до тех пор, пока не получим пустой «следующий токен». Когда мы получаем пустой токен, это означает, что все данные облачного следа были получены.

Например: предположим, что в Cloud Trail зарегистрировано 100 событий: в первом вызове API мы получили последние 50 результатов вместе с токеном для получения следующих 50 (более старых 50). Во втором вызове API мы получаем оставшиеся 50 результатов (более старые результаты) вместе со следующим токеном как nil. Это означает, что результатов для получения больше нет.

В нашем случае мы сохраняем все результаты, полученные от трейла, в нашей локальной базе данных и периодически повторяем это. Делая это во второй раз (повторяя описанный выше процесс), мы снова получаем меньше новых и мало старых результатов. Мы снова повторяем вызов API, пока не получим «следующий токен» равным нулю. Это приводит к получению избыточных данных, которые уже были сохранены в базе данных при выполнении первого цикла. Есть ли способ получить в дальнейшем только недавно зарегистрированные события облачного следа во втором цикле.


person Kalyani Kirad    schedule 13.03.2018    source источник


Ответы (3)


Как сказал @Vorsprung, вы можете использовать максимальное время даты события из своей локальной базы данных.

Вот подробное решение для вашего варианта использования / проблемы:

1. Query to your local database to check that cloudtrail data is present in the local database.

    IF yes 
        // It means you have stored some data from cloudtrail before.
        // And now you are going to do request to cloudtrail for new trail events.
        // Note - At a time of the first request you don't have a token (i.e. next-token)

        GOTO Step 3

    ELSE
        // It means you have not stored any data from cloudtrail before.
        // And now you are going to do the first request to cloudtrail. 
        // Note - At a time of the first request you don't have a token (i.e. next-token)

        GOTO Step 2

2.  LOOP true

        token = nil

        IF token
            // Send request to cloudtrail to get next bactch of latest cloudtrail events, now pass token(i.e. next-token) as parameter.
            // Which will return the maximum latest 50 trail events.
            // It will also return next-token if more cloudtrail events are remaining.

            IF next-token
              token = next-token
            ELSE
                BREAK LOOP;
            END

        ELSE
            // Send request to cloudtrail to get the latest cloudtrail events.
            // Which will return the maximum latest 50 trail events.
            // It will also return next-token if more cloudtrail events are remaining.

            IF next-token
              token = next-token
            ELSE
                BREAK LOOP;
            END
        END
    END

3.  LOOP true

        token = nil
        start_date_time = max_trail_event_date_time_form_local_db

        IF token
            // Send request to cloudtrail to get next bactch of latest cloudtrail events, now pass token and start_date_time(i.e. next-token and max_event_date_time_form_local_db) as parameters.
            // Which will return the maximum latest 50 events which are logged after start_date_time.
            // It will also return next-token if more cloudtrail events are remaining.

            IF next-token
              token = next-token
            ELSE
                BREAK LOOP;
            END

        ELSE
            // Send request to cloudtrail to get the latest cloudtrail events, now pass start_date_time(i.e. max_trail_event_date_time_form_local_db) as parameter.
            // Which will return the maximum latest 50 events which are logged after start_date_time.
            // It will also return next-token if more cloudtrail events are remaining.

            IF next-token
              token = next-token
            ELSE
                BREAK LOOP;
            END
        END
    END

Надеюсь, это будет полезно.

person viks    schedule 07.04.2018

Выберите максимальную дату из вашей локальной базы данных, а затем используйте ее в качестве даты начала для событий Cloudtrail.

person Vorsprung    schedule 13.03.2018

Вы сохраняете NextToken в своей локальной базе данных и передаете его при следующем вызове API. Вот пример.

import boto3

cloudtrail = boto3.client('cloudtrail')
paginator = cloudtrail.get_paginator('lookup_events')

StartingToken = None

page_iterator = paginator.paginate(
    LookupAttributes=[{'AttributeKey':'EventName','AttributeValue': 'RunInstances'}],
    PaginationConfig={'PageSize':10, 'StartingToken':StartingToken })
for page in page_iterator:
    for event in page["Events"]:
        print(event["EventName"],event["EventTime"])
    try:
        token_file = open("token","w") 
        token_file.write(page["NextToken"]) 
        StartingToken = page["NextToken"]
    except KeyError:
        exit()
person Sudharsan Sivasankaran    schedule 13.03.2018