Поддерживает ли AWS Lambda aws-sdk v3 или нет?

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

Я пытаюсь использовать SDK v3 в лямбда, как показано здесь. Но затем я вижу противоречивую документацию здесь.

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

{
    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module '@aws-sdk/client-sns'\nRequire stack:\n- /var/task/ReceiveMessageLoraThing.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
    "stack": [
        "Runtime.ImportModuleError: Error: Cannot find module '@aws-sdk/client-sns'",
        "Require stack:",
        "- /var/task/ReceiveMessageLoraThing.js",
        "- /var/runtime/UserFunction.js",
        "- /var/runtime/index.js",
        "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
        "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
        "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
        "    at Module._compile (internal/modules/cjs/loader.js:999:30)",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)",
        "    at Module.load (internal/modules/cjs/loader.js:863:32)",
        "    at Function.Module._load (internal/modules/cjs/loader.js:708:14)",
        "    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)",
        "    at internal/main/run_main_module.js:17:47"
    ]
}

Файл развертывается как js с правильным набором обработчиков. Если я закомментирую оператор require, он будет работать нормально:

// works
"use strict";
//const sns = require("@aws-sdk/client-sns");
exports.handler = async (event) => {
    console.log("hello");
    return true;
}

// doesn't work
"use strict";
const sns = require("@aws-sdk/client-sns");
exports.handler = async (event) => {
    console.log("hello");
    return true;
}

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

Благодарность


person thinkOfaNumber    schedule 10.02.2021    source источник


Ответы (1)


Да, вы можете использовать AWS SDK v3, как и любую другую библиотеку JS.

Среда Node для Lambda поставляется с установленным AWS SDK v2 (предыдущий), как вы можете видеть здесь: https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html

Таким образом, чтобы использовать v3, вы должны связать его со своим приложением, как и с любой другой зависимостью, и развернуть пакет (https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html).

На самом деле, даже несмотря на то, что SDK v2 доступен в среде Lambda, по-прежнему рекомендуется самостоятельно связать его со своим приложением и развернуть. Таким образом, вы всегда будете использовать указанную вами версию, а не ту, которая есть на Lambda и может быть обновлена ​​в любое время. Даже если они не вносят никаких несовместимых изменений, всегда возможно, что новая версия SDK, не протестированная с вашим конкретным приложением, будет содержать ошибку, которая сломает вашу Lambda (очень маловероятно, но возможно).

person Radzikowski    schedule 13.02.2021
comment
Это сделает мой проект немного сложнее, но хороший совет, спасибо. Любые советы по созданию нескольких отдельных лямбда-функций в одном проекте? Должен ли я дублировать/устанавливать node_modules для каждого из них? (Я использую CDK для развертывания) - person thinkOfaNumber; 15.02.2021
comment
Я не использовал CDK (только Serverless Framework), поэтому не знаю, как именно это работает, но не вижу смысла множить node_modules. Должна быть возможность создавать несколько функций в одном проекте. - person Radzikowski; 15.02.2021
comment
Хотя вы можете использовать v3 в лямбда-выражении, вы должны включить его самостоятельно, я не думаю, что он еще готов для использования лямбда-выражения. Я безуспешно пытался загрузить объект S3. Я могу заставить его работать в NodeJS, но не при развертывании на лямбда-выражении. - person Hayden; 19.02.2021
comment
Рассмотрите возможность использования слоев для предоставления необходимых модулей v3 sdk. Это не повлияет на комплектацию для вас Function. - person bdargan; 20.02.2021
comment
Слои @bdargan — это здорово, но размещение всех необходимых клиентов aws sdk в слое эффективно делает встряхивание дерева бесполезным и увеличивает время холодного запуска лямбда-выражения. - person JHH; 03.04.2021
comment
@JHH согласен, и поскольку они хотят использовать sdk v3, они так или иначе включат их. Я предлагаю, чтобы они предоставили их своей лямбде в изолированном слое, а не объединяли с остальными модулями. На отдельном уровне они могут делиться с другими лямбда-выражениями, и когда v3 предоставляется из коробки, OP может либо отказаться от этого уровня, либо продолжить поддерживать конкретную версию v3 самостоятельно. - person bdargan; 04.04.2021
comment
Есть ли какая-то причина, по которой они не включают aws-sdk v3 в качестве пакета так же, как они делают это с v2? - person zrkl; 06.07.2021