Автоматическая очистка дистрибутивов CloudFront после отключения - PullRequest
0 голосов
/ 02 мая 2019

В настоящее время я создаю серверное приложение на основе AWS Lambda, которое создает дистрибутивы CloudFront от имени пользователей. В настоящее время, когда пользователь вызывает мою операцию удаления, моя функция API Lambda отключает распространение CloudFront. Тем не менее, дистрибутивы никогда не очищаются и не удаляются, потому что мне нужно дождаться завершения отключения в первую очередь. Учитывая ограничение Lambda в 15 минут, я не могу просто ждать, пока отключение завершит развертывание, и это было бы неэффективно, даже если бы я мог.

Я понимаю, что мог бы иметь функцию Lambda, периодически опрашивать мои дистрибутивы CloudFront и очищать их, но я надеюсь сделать это управляемым событиями способом, чтобы это происходило как можно ближе к реальному времени, и я не не нужно использовать какие-либо вычисления, когда нечего удалять.

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

Есть предложения, как этого добиться? Это вообще возможно?

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

AWS официально заявляет, что CloudFront может потребоваться максимум 15 минут, чтобы включить или отключить распространение. Несмотря на то, что мы обнаружили, что это в целом верно, мы сталкивались со случаями, когда отключение рассылки занимает более 15 минут, и поэтому я рекомендовал бы, чтобы любое решение учитывало возможность того, что по какой-либо причине это может занять более 15 минут. минут, чтобы отключить распространение.

Хотя это не идеальное решение, управляемое событиями, определенно возможно сделать это в основном на основе событий. Наше решение реализовано с использованием CloudWatch, Lambda, SQS и CloudTrail. Понятно, что вы уже включили CloudTrail, но для будущих читателей, которые могут столкнуться с подобной проблемой, если вы еще этого не сделали, первым делом необходимо включить CloudTrail для входа в свою учетную запись (примечание: использование CloudTrail повлечет за собой сборы, как подробно здесь ). Как только CloudTrail включен, CloudWatch Events сможет получать события CloudFront из CloudTrail.

Теперь, когда CloudTrail включен, мы можем фактически удалить отключенный дистрибутив. В CloudWatch создайте событие CloudWatch, которое при событии UpdateDistribution из CloudFront запускает функцию Lambda, которая публикует сообщение, содержащее идентификатор распространения, в очередь задержки SQS с максимальной задержкой 15 минут (настройка на основе консоли инструкции здесь ).

Потребителем сообщения в очереди SQS является вторая лямбда-функция. При вызове эта лямбда-функция должна вызывать API CloudFront GetDistribution для предоставленного идентификатора распространения и проверять, если Distribution.DistributionConfig.Enabled === true, и если это ложно, проверять, если Distribution.Status === Deployed.

Логика может быть адаптирована к вашим конкретным потребностям или варианту использования, но отсюда потенциальный рабочий процесс мог бы просто проверить, если Distribution.DistributionConfig.Enabled === true. Если это правда, то выйдите из функции, потому что вы ожидали, что она будет отключена, но это не так, значит что-то не так; возможно, дистрибутив был повторно активирован вручную, или произошла ошибка его отключения где-то, или, может быть, UpdateDistribution API был вызван по другой причине, независимо от причины, дистрибутив не находится в ожидаемом состоянии, и мы не должны продолжать. Перед выходом из функции вы должны / можете убедиться, что это не произойдет, молча отправив сообщение SNS, чтобы уведомить администратора о том, что произошла эта ошибка.

Двигаясь дальше, если Distribution.DistributionConfig.Enabled === true возвращает false, убедитесь, что Distribution.Status === Deployed. Если это возвращает false, это будет означать, что отключение все еще InProgress, и вам нужно подождать дольше. Чтобы справиться с этим, не оставляя Lambda включенным (и не платя за это), просто опубликуйте второе сообщение в моей очереди задержки, которое снова содержит идентификатор распределения, и функция затем завершается. Лямбда сработает снова через 15 минут и повторите следующий процесс при следующем вызове.

Если проверка на Distribution.DistributionConfig.Enabled === true возвращает ложь, а Distribution.Status === Deployed возвращает истину, то распределение отключено и готово к удалению. Отсюда просто вызовите DeleteDistribution API с идентификатором распределения и ETag из GetDistribution вызова, который вы сделали в начале. Работа API выглядит примерно так: DeleteDistribution --id {distributionId} --if-match {ETag}. Если он успешно удален, вы получите 204, и все, все готово. Если есть ошибка, вы получите 4xx, который вам нужно будет обработать.

0 голосов
/ 02 мая 2019

Я рекомендую использовать функцию шага AWS для управления окончательным удалением CloudFront Distribution.Ваша лямбда может отключить CloudFront Distribution и вызвать функцию Step.Шаговая функция может управлять опросом распределения и окончательным удалением, вызывая функции Lambda.

...