无服务器离线无法使用 serverless-offline-sns 启动

问题描述 投票:0回答:1

我尝试离线运行无服务器时遇到此错误:

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/mypc/Downloads/textai/src/functions/processExpenseAnalysisJob.js' imported from /home/mypc/Downloads/textai/node_modules/serverless-offline-sns/dist/index.js

我试图添加 serverless-offline-sns 以在本地工作,但如果我将其放入插件中,我似乎无法启动该应用程序,如果我删除它,它就可以工作。我已经删除了 node_modules 和 npm install。我是否需要使用额外的东西,例如使用我需要 elastiqmq 的 serverless-offline-sqs ?我正在使用 SNS 来自:

    const command = new StartExpenseAnalysisCommand({
      DocumentLocation: {
        S3Object: {
          Bucket: fileObj.s3.bucket.name,
          Name: fileObj.s3.object.key,
        },
      },
      NotificationChannel: {
        SNSTopicArn: process.env.SNS_TOPIC_ARN,
        RoleArn: process.env.ROLE_ARN,
      },
    });

这将触发 processExpenseAnalysisJob 处理程序,在我测试部署之前它可以完美地工作。

我的无服务器.yml

service: ${env:APP_SERVICE_NAME}
useDotenv: true
configValidationMode: warn

plugins:
  - serverless-offline-sqs
  - serverless-offline-sns
  - serverless-offline
  - serverless-plugin-typescript
  - serverless-plugin-optimize

provider:
  name: aws
  runtime: nodejs18.x
  memorySize: 128
  region: ${env:AWS_REGION}
  stage: ${opt:stage,'dev'}
  environment:
    # APP
    APP_STAGE: ${env:APP_STAGE}
    APP_SERVICE_NAME: ${env:APP_SERVICE_NAME}
    AWS_ACCOUNT_ID: ${env:AWS_ACCOUNT_ID}
    DEVELOPMENT_PATH: ${env:DEVELOPMENT_PATH}
    EXCHANGE_RATE_API: ${env:EXCHANGE_RATE_API}
    SNS_TOPIC_ARN: !GetAtt TextractTriggerTopic.TopicArn
    ROLE_ARN: ${env:ROLE_ARN}

  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - sqs:SendMessage
            - sqs:ReceiveMessage
            - sqs:DeleteMessage
          Resource: !GetAtt MySQSQueue.Arn
        - Effect: Allow
          Action:
            - textract:StartExpenseAnalysis
            - textract:GetExpenseAnalysis
          Resource: "*"
        - Effect: Allow
          Action:
            - s3:GetObject
            - s3:PutObject
          Resource: "*"
        - Effect: Allow
          Action:
            - sns:Publish
          Resource: !GetAtt TextractTriggerTopic.TopicArn
        - Effect: Allow
          Action:
            - lambda:InvokeFunction
          Resource: "*"

functions:
  startExpenseAnalysisJob:
    handler: src/functions/startExpenseAnalysisJob.handler
    timeout: 180
    maximumRetryAttempts: 1
    events:
      - sqs:
          arn: !GetAtt MySQSQueue.Arn
  processExpenseAnalysisJob:
    handler: src/functions/processExpenseAnalysisJob.handler
    events:
      - sns:
          arn: !GetAtt TextractTriggerTopic.TopicArn
          topicName: TextractTriggerTopic-${self:provider.stage}

resources:
  Resources:
    MySQSQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: TextractTriggerQueue-${self:provider.stage}
        VisibilityTimeout: 360

    TextractTriggerTopic:
      Type: AWS::SNS::Topic
      Properties:
        TopicName: TextractTriggerTopic

custom:
  serverless-offline-sqs:
    autoCreate: true
    apiVersion: "2012-11-05"
    endpoint: http://0.0.0.0:9324
    region: ${self:provider.region}
    accessKeyId: root
    secretAccessKey: root
    skipCacheInvalidation: false

  serverless-offline-sns:
    port: 4002
    debug: false
    host: 0.0.0.0
    endpoint: http://localhost:4001

这是我的package.json

  "devDependencies": {
    "@types/aws-lambda": "^8.10.134",
    "dotenv": "^16.4.5",
    "prettier": "^3.2.5",
    "serverless": "^3.38.0",
    "serverless-offline": "^13.3.3",
    "serverless-offline-sns": "^0.77.2",
    "serverless-offline-sqs": "^8.0.0",
    "serverless-plugin-optimize": "^4.2.1-rc.1",
    "serverless-plugin-typescript": "^2.1.5",
    "ts-node": "^10.9.2",
    "typescript": "^5.3.3"
  },
  "dependencies": {
    "@aws-sdk/client-s3": "^3.525.0",
    "@aws-sdk/client-sqs": "^3.525.0",
    "@aws-sdk/client-textract": "^3.525.0",
    "amazon-textract-response-parser": "^0.4.0",
    "axios": "^1.6.7"
  }

更新: 有谁知道吗?我似乎找不到问题所在。但给我带来错误的部分是我的 serverless.yml 的这一部分:

functions:
  ......
  processExpenseAnalysisJob:
    handler: src/functions/processExpenseAnalysisJob.handler
    events:
      - sns:
          arn: arn:aws:sns:${self:provider.region}:${aws:accountId}:TextractTriggerTopic
  .....

当我将 sns 事件添加到我的 lambda 函数中时,如果我删除该事件,它会起作用,但我似乎找不到以下问题:https://www.serverless.com/plugins/serverless-offline- sns#配置。之前我有

!GetAtt TextractTriggerTopic.TopicArn
但将其更改为 serverless-offline-sns 在离线运行 serverless 时无法识别 !GetAtt。

amazon-web-services serverless amazon-sns aws-serverless serverless-offline
1个回答
0
投票

我为任何想知道的人找到了解决方案......

错误是我的 serverless.yml 插件的顺序,应该如下:

插件:

  • serverless-plugin-typescript # 必须在转译插件之前
  • serverless-plugin-optimize # 可以在转译之前或之后
  • serverless-offline-sns # 可以按任意顺序
  • serverless-offline-sqs # 可以按任意顺序
  • serverless-offline # 必须是最后一个

serverless-plugin-typescript:该插件将 TypeScript 代码转换为 JavaScript。它需要放置在任何修改 JavaScript 代码的插件之前,这就是为什么我收到错误 [ERR_MODULE_NOT_FOUND],因为我的 ts 文件有问题,因为无服务器离线插件无法找到等效的 js 文件,它会抛出错误 module not find 如所述这里serverless-plugin-typescript。 serverless-offline:这个插件需要首先加载所有其他插件,所以它应该放在最后。

遵循此顺序可确保插件以正确的顺序执行,以实现所需的结果:转译 TypeScript,可能优化代码,然后设置离线环境。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.