2016-05-27 4 views
2

У меня есть AWS Python Lambda, который управляет тегами ресурсов (многие вызовы API AWS с boto3) для моей инфраструктуры. Функция, выполняемая на моем ноутбуке, хорошо работает, а также под Lambda. Но когда я выполняю его под Lambda, все мои журналы (уровень отладки или ошибки) не отправляются в журналы cloudwatch. Вместо того, чтобы Я несколько журналов, как это:AWS Lambda python Сброс сброшенного соединения

Resetting dropped connection: ec2.us-west-2.amazonaws.com 
Resetting dropped connection: ec2.us-west-2.amazonaws.com 

Google сказал мне, что это проблема относительно urlib3 и слишком высокая частота запроса по отношению к API AWS.

Вопрос в том, как избежать этого в Лямбде, чтобы получить мои журналы в журналах cloudwatch? Я ищу лучшее решение, чем многократный сон внутри моего кода. Есть ли способ сделать это во всем мире?

Благодаря

+0

Как вы посылаете журналы в CloudWatch? Из того, что я испытал, вы можете просто использовать стандартный пакет 'logging' для входа в консоль, и все заканчивается CloudWatch. – dorian

+0

Спасибо за ваш ответ. Для протоколирования: регистратор = logging.getLogger() logger.setLevel (logging.INFO) logger.debug («XXXX») – Matt

+0

Кроме того, журнал, кажется, хорошо толкнул cloudwatch, потому что я могу видеть свой первый журнал, который указал начало моей лямбды, но после этого у меня есть только журналы «потерянного соединения». Кажется, что они перезаписывают мои журналы. – Matt

ответ

1

Хорошо, наконец, это работает. Действительно, я слишком агрессивен в процессе повторных попыток, но мне нужно выполнить каждую операцию как можно скорее (например: прикрепить EBS, когда она доступна). В boto3 есть более чистый способ подождать, пока ресурс станет готовым, чем положить time.sleep (xx) в ваш код.

Решение заключается в использовании boto3 waiter . Мой совет - установить настраиваемое значение для интервала повтора, поскольку по умолчанию оно равно 15 с (слишком длинное).

waiter.config.delay = 1 
waiter.config.max_attempts = 10(as you want for this param) 

С этим параметрам можно избежать лямбда отправлять журналы, как это «Сброс разрыва связи: ec2.us-west-2.amazonaws.com» и вы выполняете свой Lambda самым быстрым способом.

Я согласен с smdev, который сказал, что не стоит спать внутри лямбда-функции (boto3 waiter - это сон, как), но для меня это приемлемо, когда ваша функция лямбда называется только несколько раз. Например, когда уведомление Autoscaling вызывает вашу Лямбду. Если ваша Лямбда вызывается непосредственно по API Gateway (пример) на умеренной или высокой частоте, это очень плохая идея, но если это всего 2-3 раза в день, все в порядке.

0

AWS журналы clodwatch не будет "перезаписать" свои собственные журналы. Пожалуйста, не спать в лямбда-функции, так как вы будете платить за это. Также, если скорость запроса слишком высока, вы получите ошибки RequestLimitExceeded.

Есть несколько способов, чтобы избежать этого:

  1. Проверить и удалить любой Boto код, который звонит по API AWS в сплошном цикле (для/времени)
  2. Используйте итераторов, MaxResults и нумерация страниц в Бото код, чтобы получить список/коллекцию элементов вместо запросов для отдельных.
  3. Используйте две лямбды с sqs между ними (для случаев, когда есть асинхронная зависимость). Например, если удалять неиспользуемые AMI - один лямбда, чтобы идентифицировать и отменять регистрацию AMI и нажимать связанные снимки на sqs. Вторая лямбда для чтения из sqs и удаления снимков.

Надеюсь, это прояснится.

+0

Я согласен с вами в том, что спящий внутри функции лямбда не является хорошим способом, но, например, в моем случае я создаю том EBS и присоединяю его к экземпляру. Но прежде чем присоединить его, мне нужно подождать, пока громкость станет «доступной», и поэтому мне нужно проверить его статус. Мне нужно приложить его как можно скорее. Как вы справляетесь с этим делом? – Matt

+0

Humm, я думаю, что могу ответить на свой вопрос, использовать официантов ... Но в то же время официант просто выполняет автоматическую повторную попытку каждые X секунд. – Matt

+0

Ваш случай представляет собой асинхронный корпус (см. Пункт 3). Я бы справился с этим, используя SQS/SNS и две лямбда-функции. Первая лямбда создала бы объем EBS и отправила идентификатор тома и идентификатор экземпляра, к которому он должен быть присоединен как сообщение SQS/SNS. Вторая лямбда будет читать SQS/SNS и попытаться присоединить том, если он доступен, если не искать следующее сообщение. Если сообщений нет, он может выйти. Выбор SQS/SNS будет зависеть от того, хотите ли вы нажать или потянуть. –

-1

где поставить эту конфигурацию ожидания:

waiter.config.delay = 1 
waiter.config.max_attempts = 10 

(как вы хотите для этого пар)

Смежные вопросы