Обновление сессии boto3 при разбиении на страницы через облачную трассу - PullRequest
0 голосов
/ 20 октября 2019

Я пишу скрипт на python, используя boto3, чтобы сообщить о вызовах API, сделанных за последние несколько месяцев. У меня почти готов сценарий, но у нас максимальная продолжительность сеанса 1 час, и это всегда будет занимать больше времени, поэтому сеанс истекает и сценарий умирает.

Я пытался периодически обновлять сеанс, чтобыостановить его от истечения срока действия, но я не могу заставить его работать. Я действительно надеюсь, что кто-то делал это раньше и может сказать мне, что я делаю неправильно?

Ниже приведена сокращенная версия кода.

import boto3
import datetime
import time
from botocore.exceptions import ClientError

session_start_time = datetime.datetime.now()
start_date = datetime.datetime.now()
start_date -= datetime.timedelta(days=1)
end_date = datetime.datetime.now()
role='arn:aws:iam::1234:role/role'

def role_arn_to_session(**args):
  client = boto3.client('sts')
  response = client.assume_role(**args)

  return boto3.Session(
      aws_access_key_id=response['Credentials']['AccessKeyId'],
      aws_secret_access_key=response['Credentials']['SecretAccessKey'],
      aws_session_token=response['Credentials']['SessionToken'])


session = role_arn_to_session(RoleArn=role,RoleSessionName='session')

cloudtrail = session.client('cloudtrail',region_name='us-east-1')

paginator = cloudtrail.get_paginator("lookup_events")

StartingToken = None
page_iterator = paginator.paginate(
  PaginationConfig={'PageSize':1000, 'StartingToken':StartingToken },
  StartTime=start_date,
  EndTime=end_date)

for page in page_iterator:
  for ct in page['Events']:
    print(ct)
  try:
    token_file = open("token","w")
    token_file.write(page["NextToken"])
    StartingToken = page["NextToken"]

  except KeyError:
    break

  if (datetime.datetime.now() - session_start_time).seconds/60 > 10:
    page_iterator = None
    paginator = None
    cloudtrail = None
    session = None

    session = role_arn_to_session(RoleArn=role,RoleSessionName='session')

    cloudtrail = session.client('cloudtrail',region_name='us-east-1')
    paginator = cloudtrail.get_paginator("lookup_events")
    page_iterator = paginator.paginate(
      PaginationConfig={'PageSize':1000, 'StartingToken':StartingToken },
      StartTime=start_date,
      EndTime=end_date)

    session_start_time = datetime.datetime.now()

Я быпризнателен за любую помощь в этом.

Заранее спасибо

1 Ответ

0 голосов
/ 21 октября 2019

Ваше решение не работает, потому что вы просто создаете теневую переменную page_iterator, поэтому изменения, внесенные в итератор, не вступают в силу.

Вы можете увеличить продолжительность сеанса, если вы запускаете свой скрипт, используя long-срок полномочий.

По умолчанию временные учетные данные безопасности, созданные AssumeRole, сохраняются в течение одного часа. Однако вы можете использовать необязательный параметр DurationSeconds, чтобы указать продолжительность сеанса.

В противном случае вам необходимо немного пересмотреть логику приложения. Вы можете попытаться использовать более короткий период времени при получении трейлов, например, вместо того, чтобы использовать 1 день, попробуйте использовать 6 часов и соответственно сдвигать временной интервал, пока вы не получите все нужные трейлы. На мой взгляд, это лучший подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...