Если вы пришли к этой статье из-за ее названия, вы, скорее всего, знаете, что такое cfn-response, поэтому можете пропустить следующий раздел. Для других я сразу перехожу к краткому введению в модуль cfn-response.

Что такое модуль cfn-response?

Чтобы понять все нижеприведенное, просто почувствуйте контекст: вы создаете собственный ресурс в своем стеке CloudFormation, который поддерживается функцией Lambda. После того, как ваша служба Lambda вызывается при событиях CREATE / UPDATE / DELETE стека, она должна отправить ответ SUCCESS / FAILED обратно в службу CloudFormation, чтобы сообщить о состоянии результата операции.

Если этого не произойдет, стек CloudFormation застрянет в состоянии «В ПРОЦЕССЕ» на досадно долгое время - около 3 часов. (Ну, вы все еще можете разблокировать его вручную, если вы достаточно дальновидны, чтобы опубликовать полученное событие в журналах, но это другая история ...)

cfn-response - это модуль npm, который вы получили от сервиса AWS Lambda совершенно бесплатно, который предоставляет удобный интерфейс для беспроблемной отправки ответа, описанного в предыдущем абзаце. «Бесплатно» здесь означает, что вам даже не нужно включать его в свой пакет Lambda. Вам нужно только вызвать его из своего кода следующим образом:

const cfnResp = require('cfn-response');

Почему это _so_ удобно? Потому что это вполне нормальная практика - включать код функции Lambda в свой шаблон CloudFormation в случае использования настраиваемых ресурсов. Поскольку этот тип лямбда-функций тесно связан с жизненным циклом стека CloudFormation, имеет смысл хранить их вместе, избегая ненужных сложностей, таких как развертывание кода в корзине S3.

А в случае встроенного макета кода AWS устанавливает ограничение в 4096 символов, которое вы должны соблюдать. Модуль cfn-response экономит вам почти половину этого числа (!), Предоставляя полноценный помощник для ответов CloudFormation. Для некоторых из моих пользовательских ресурсов с поддержкой Lambda было бы совершенно невозможно сохранить их встроенными без использования модуля cfn-response ...

Еще одно бесплатное преимущество состоит в том, что вы делаете код функции Lambda более ясным и простым в обслуживании, сохраняя при этом «стандартную библиотеку» в стороне и неизменной.

cfn-ответ с nodejs8.10

Еще одно бесплатное преимущество использования cfn-response (особенно для разработчиков, не использующих чистый JS, таких как я) заключается в том, что он предоставляется самим AWS в его среде выполнения Lambda nodejs, поэтому он должен быть полностью безопасным и надежным в использовании, верно? именно так… И поэтому я пишу эту статью сейчас.

После недавнего вывода из эксплуатации среды выполнения nodejs6.10 nodejs8.10 становится самой старой средой выполнения, поддерживаемой AWS. Все новые функции Lambda не будут развернуты при использовании версии 6.10 и должны быть перенесены на 8.10. Когда год назад был представлен nodejs8.10, AWS серьезно рекомендовала прекратить использование обратных вызовов в новом коде JS и перенести его на обещания.

Если вы последуете этой рекомендации, продолжая использовать модуль cfn-response так же, как и раньше, он перестанет отправлять ответы и ваши стеки застрянут ... Причина в том, что модуль все еще использует обратные вызовы ... Со стороны AWS нет обновлений по этой проблеме пока, а источников информации о модуле совсем немного - первый - единственное упоминание модуля на Кодовой странице лямбда-функции, а второй - в примерах

Что же делать, если вы столкнулись с проблемой, описанной выше? Просто оберните код функции ответа, чтобы он обещал, например, вот так:

function response(event, context, status, err) {
  return new Promise(() => cfnResp.send(event, context, status,
    err ? { error: err } : {}, event.LogicalResourceId));
}

И тогда используйте его как обычно.