【问题标题】:Error: Cannot find module '@aws-sdk/client-sns'错误:找不到模块“@aws-sdk/client-sns”
【发布时间】:2022-03-29 22:18:11
【问题描述】:

调用我的 lambda 时出现此错误。

"errorType": "Runtime.ImportModuleError", "errorMessage": "错误:找不到模块 '@aws-sdk/client-sns'\n需要堆栈:\n- /var/task/handler.js\n- /var/runtime/UserFunction.js\n- / var/runtime/index.js", “痕迹”: [ “Runtime.ImportModuleError:错误:找不到模块'@aws-sdk/client-sns'”,

import * as AWS from '@aws-sdk/client-sns';
import { JamaSnsMessage } from './models/jama';
import { region, snsTopicArn } from './utils/constants';
import { log } from './utils/logger';

const client = new AWS.SNS({ region });

/**
 * Publishes given SNS formatted Jama items to SNS topic
 *
 * @param {JamaSnsMessage[]} items
 */
export const publishItems = async (items: JamaSnsMessage[]): Promise<void> => {
  if (!items || items.length <= 0) {
    return;
  }

  for (const item of items) {
    const params = {
      /* eslint-disable */
      MessageStructure: 'json',
      Message: JSON.stringify(item),
      TopicArn: snsTopicArn,
      /* eslint-enable */
    };
    log.info(`Sending jama item: ${JSON.stringify(item)} to sns`);
    await send(params);
  }
};

export const send = async (params: AWS.PublishInput): Promise<void> => {
  try {
    const data = await client.send(new AWS.PublishCommand(params));
    log.info(`Item: ${JSON.stringify(params)} was published with id: ${data.MessageId}`);
  } catch (error) {
    log.error(`Error while publishing message ${JSON.stringify(params)}. Cause: ${error}`);
  }
};

【问题讨论】:

    标签: aws-sdk amazon-sns aws-sdk-nodejs


    【解决方案1】:

    如果您使用的是 SDK 的 V2,请使用:

    var AWS = require('aws-sdk');
    AWS.config.update({region: 'REGION'});
    
    // Create promise and SNS service object
    const SNS = new AWS.SNS({apiVersion: '2010-03-31'})
    

    如果出于大小原因您只想在 Lambda 函数中使用 SNS 模块,我建议您使用适用于 JavaScript 的 AWS SKD V3。默认情况下,Lambda 仍仅与 SDK 的 V2 兼容,但有一种解决方法。这是example of creating a function using only modules of the AWS SDK for JavaScrpt - version 3

    【讨论】:

    • 嗨,Brian,感谢您的回答,因为我遇到了与 OP 类似的问题。但是,您的回答对我来说有点难以理解。首先你的评论“问题是进口......”,但我不确定为什么这是一个问题......除非它与你稍后关于 V2/V3 的评论有关?其次,在 SO 上,在您的问题中提供答案是一种很好的形式,而不是链接到 OP 可以找到答案的位置,就像您对链接示例所做的那样。我将继续跟进链接,但最好复制与此问题相关的相关位。谢谢大家!
    • 我已经解决了,这是我使用的节点版本的问题。我将我的节点版本更新为 12.X,现在它能够找到该库。所以,我可以说 V3 至少需要节点版本 12.X。除了节点版本,我没有更改任何其他内容。
    • 目前lambda环境默认只加载V2 AWS SDK。要使用 V3,您需要将包包含在层中或您自己的函数中。
    【解决方案2】:

    在尝试导入 AWS SDK for JavaScript v3 中记录的 DynamoDB V3 客户端时,我的 Node 14 Lambda 函数遇到了类似的问题。

    记录的函数:

    错误:找不到模块“@aws-sdk/client-dynamodb”DynamoDB

    我跟着 this guide 创建了一个 Lambda 层并将其附加到 Lambda 函数。

    但是,我认为该过程可以简化 - 您可以通过 CloudShell 来执行此操作,而不是启动 EC2 实例。托管您的 Lambda 的区域不需要支持 CloudShell。只需从任何支持它的区域启动 CloudShell,然后执行以下操作:

    # Create the directory
    $ mkdir -p aws-sdk-layer/nodejs
    $ cd aws-sdk-layer/nodejs
    
    # Add the clients you want to use from the new SDK
    $ yarn add @aws-sdk/client-dynamodb @aws-sdk/client-apigatewaymanagementapi
    
    # Create the zip file
    $ zip -r ../package.zip ../
    
    # Publish the layer
    # In the below, change:
    #   The layer name (currently node_sdk)
    #   The description (currently "My layer")
    #   The region
    #
    # Copy from the response the value of the "LayerVersionArn" key
    #
    $ aws lambda publish-layer-version --layer-name node_sdk --description "My layer" --license-info "MIT" --compatible-runtimes nodejs14.x --zip-file fileb://../package.zip --region <specify a region>
    
    # Add the layer to your function
    # In the below, change:
    #   The function name (currently my-function)
    #   Set the layer's ARN to the value of the "LayerVersionArn" key in the response from the previous statement (currently arn:aws:lambda:us-east-2:123456789012:layer:node_sdk:1)
    #   The region
    #
    $ aws lambda update-function-configuration --function-name my-function --layers arn:aws:lambda:us-east-2:123456789012:layer:node_sdk:1 --region <specify a region>
    
    

    你应该很高兴!

    【讨论】:

      【解决方案3】:

      我在使用 AWS 层和 ES 模块时遇到了类似的问题。使用绝对说明符进行导入解决了我的问题。

      import {S3Client, GetObjectCommand} from "file:///opt/nodejs/node_modules/@aws-sdk/client-s3/dist-cjs/index.js";
      

      【讨论】:

        【解决方案4】:

        问题在于带有 V3 sdk 的 Node 版本 10.X。当我将节点版本更新为 12.X 时,它开始工作。我正在使用 AWS CDK,因此我还需要将 CDK 依赖项更新到 1.88.0 以获得此 12.X 支持。

        在 CDK 项目中更改 lambda 的运行时 -

        运行时: lambda.Runtime.NODEJS_12_X

        【讨论】:

        • 奇怪,我使用的是 Node.js 12.x,但仍然出现错误。我认为与我的 javascript 有关...
        猜你喜欢
        • 1970-01-01
        • 2020-12-02
        • 2022-11-24
        • 2021-11-18
        • 2018-06-18
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多